Hi there.
I need your help because I have a bug in my sample code. I'm trying to use modern openGL stuff (shaders). so i went through jogamp demo code like this sample. In my sample, I get quite easily to display a triangle and tranform it (scale, rotate, translate). But as soon as I apply view and projection matrix, I can't get to see my triangle anymore. I double-checked code with jogl demos and also drew my scene on paper to make sure I should see the triangle. Obviously I am doing something wrong. But what ? Can someone take a quick look at my Short, Self Contained, Correct (Compilable), Example ? (Uncomment commented lines in display() to reproduce the issue) Thanks in advance ! vs.glsl #version 400 in vec3 position; uniform mat4 modelToClipMatrix; void main() { gl_Position = modelToClipMatrix * vec4(position, 1); } fs.glsl #version 400 in vec3 interpolatedColor; out vec4 outputColor; void main() { outputColor = vec4(0, 1, 0, 1); } Demo.java package demo; import com.jogamp.newt.Display; import com.jogamp.newt.NewtFactory; import com.jogamp.newt.Screen; import com.jogamp.newt.opengl.GLWindow; import com.jogamp.opengl.GL; import static com.jogamp.opengl.GL.GL_NO_ERROR; import static com.jogamp.opengl.GL2ES2.GL_FRAGMENT_SHADER; import static com.jogamp.opengl.GL2ES2.GL_VERTEX_SHADER; import com.jogamp.opengl.GL4; import com.jogamp.opengl.GLAutoDrawable; import com.jogamp.opengl.GLCapabilities; import com.jogamp.opengl.GLEventListener; import com.jogamp.opengl.GLProfile; import com.jogamp.opengl.math.FloatUtil; import com.jogamp.opengl.util.Animator; import com.jogamp.opengl.util.GLBuffers; import com.jogamp.opengl.util.glsl.ShaderCode; import com.jogamp.opengl.util.glsl.ShaderProgram; import java.nio.FloatBuffer; public class Demo implements GLEventListener { private final String SHADERS_ROOT="/demo/shaders"; public static GLWindow glWindow; public static Animator animator; private final int[] objects=new int[1]; private int program, modelToClipMatrixUL; float g_vertex_buffer_data[]= { -1.0f, -1.0f, 0.0f, 1.0f, -1.0f, 0.0f, 0.0f, 1.0f, 0.0f }; float[] cameraRaw= { 4.0f, 3.0f, 3.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f }; float[] translation=new float[16]; float[] scale=new float[16]; float[] rotation=new float[16]; float[] model=new float[16]; float[] view=new float[16]; float[] projection=new float[16]; float[] mvp=new float[16]; float[] temp=new float[16]; public static void main(String[] args) { // create window Display display=NewtFactory.createDisplay(null); Screen screen=NewtFactory.createScreen(display, 0); GLProfile glProfile=GLProfile.get(GLProfile.GL4); GLCapabilities glCapabilities=new GLCapabilities(glProfile); glCapabilities.setHardwareAccelerated(true); glWindow=GLWindow.create(screen, glCapabilities); glWindow.setSize(320, 240); glWindow.setVisible(true); Demo demo=new Demo(); glWindow.addGLEventListener(demo); animator=new Animator(glWindow); animator.setRunAsFastAsPossible(true); animator.start(); } public Demo() { } @Override public void init(GLAutoDrawable _drawable) { GL4 gl4=_drawable.getGL().getGL4(); initVbo(gl4); initProgram(gl4); gl4.glEnable(GL4.GL_DEPTH_TEST); } @Override public void dispose(GLAutoDrawable _drawable) { GL4 gl4=_drawable.getGL().getGL4(); gl4.glDeleteProgram(program); System.exit(0); } @Override public void display(GLAutoDrawable _drawable) { GL4 gl4=_drawable.getGL().getGL4(); long time = System.currentTimeMillis(); // create model matrix FloatUtil.makeScale(scale, true, 1.5f, 1.5f, 1.5f); FloatUtil.makeRotationEuler(rotation, 0, 0.0f, 0.0f, (time%1000)/1000.0f); FloatUtil.makeTranslation(translation, true, 0.0f, 0.0f, 0.0f); FloatUtil.makeIdentity(model); FloatUtil.multMatrix(model, scale); FloatUtil.multMatrix(model, rotation); FloatUtil.multMatrix(model, translation); // create mvp matrix FloatUtil.makeLookAt(view, 0, cameraRaw, 0, cameraRaw, 3, cameraRaw, 6, temp); FloatUtil.makePerspective(projection, 0, true, FloatUtil.HALF_PI, 4.0f/3.0f, 0.1f, 100.0f); FloatUtil.makeIdentity(mvp); FloatUtil.multMatrix(mvp, model); // FloatUtil.multMatrix(mvp, view); // uncomment both lines to trigger the issue // FloatUtil.multMatrix(mvp, projection); // uncomment both lines to trigger the issue gl4.glClearColor(0f, .33f, 0.66f, 1f); gl4.glClearDepthf(1f); gl4.glClear(GL4.GL_COLOR_BUFFER_BIT|GL4.GL_DEPTH_BUFFER_BIT); gl4.glUseProgram(program); gl4.glUniformMatrix4fv(modelToClipMatrixUL, 1, false, mvp, 0); // push buffer gl4.glBindBuffer(GL4.GL_ARRAY_BUFFER, objects[0]); gl4.glEnableVertexAttribArray(0); gl4.glVertexAttribPointer(0, 3, GL4.GL_FLOAT, false, 0, 0); // draw the triangle gl4.glDrawArrays(GL4.GL_TRIANGLES, 0, 3); gl4.glDisableVertexAttribArray(0); gl4.glUseProgram(0); } @Override public void reshape(GLAutoDrawable glad, int i, int i1, int i2, int i3) { } private void initVbo(GL4 gl4) { // create vertex coordinates VBO gl4.glGenBuffers(1, objects, 0); // The following commands will talk about our 'vertexbuffer' buffer gl4.glBindBuffer(GL4.GL_ARRAY_BUFFER, objects[0]); // Give our vertices to OpenGL. FloatBuffer vertexBuffer=GLBuffers.newDirectFloatBuffer(g_vertex_buffer_data); int size=g_vertex_buffer_data.length*GLBuffers.SIZEOF_FLOAT; gl4.glBufferData(GL4.GL_ARRAY_BUFFER, g_vertex_buffer_data.length*Float.BYTES, vertexBuffer, GL4.GL_STATIC_DRAW); } private void initProgram(GL4 gl4) { ShaderCode vertShader=ShaderCode.create(gl4, GL_VERTEX_SHADER, this.getClass(), SHADERS_ROOT, null, "vs", "glsl", null, true); ShaderCode fragShader=ShaderCode.create(gl4, GL_FRAGMENT_SHADER, this.getClass(), SHADERS_ROOT, null, "fs", "glsl", null, true); ShaderProgram shaderProgram=new ShaderProgram(); shaderProgram.add(vertShader); shaderProgram.add(fragShader); shaderProgram.init(gl4); program=shaderProgram.program(); gl4.glBindAttribLocation(program, 0, "position"); gl4.glBindAttribLocation(program, 3 , "color"); gl4.glBindFragDataLocation(program, 0, "outputColor"); shaderProgram.link(gl4, System.out); modelToClipMatrixUL=gl4.glGetUniformLocation(program, "modelToClipMatrix"); checkError(gl4); } protected void checkError(GL gl) { int error=gl.glGetError(); if(error!=GL_NO_ERROR) throw new Error("OpenGL Error "+error); } } |
Still searching on the internet for clues on how to use FloatUtil.makeLookAt and FloatUtil.makePerspective to produce the mvp matrix that I send to the vertex shader.
According your experience, is this the right way to do ? // create model matrix FloatUtil.makeScale(scale, true, 1.5f, 1.5f, 1.5f); FloatUtil.makeRotationEuler(rotation, 0, 0.0f, 0.0f, (time%1000)/1000.0f); FloatUtil.makeTranslation(translation, true, 0.0f, 0.0f, 0.0f); FloatUtil.makeIdentity(model); FloatUtil.multMatrix(model, scale); FloatUtil.multMatrix(model, rotation); FloatUtil.multMatrix(model, translation); // create mvp matrix FloatUtil.makeLookAt(view, 0, cameraRaw, 0, cameraRaw, 3, cameraRaw, 6, temp); FloatUtil.makePerspective(projection, 0, true, FloatUtil.HALF_PI, 4.0f/3.0f, 0.1f, 100.0f); FloatUtil.makeIdentity(mvp); FloatUtil.multMatrix(mvp, model); FloatUtil.multMatrix(mvp, view); FloatUtil.multMatrix(mvp, projection); ... gl4.glUseProgram(program); gl4.glUniformMatrix4fv(modelToClipMatrixUL, 1, false, mvp, 0); |
In reply to this post by Kraft
Ok i got it ! I finally get to see my sweet triangle !
My mistake was in the multiplication order. Instead of FloatUtil.multMatrix(model, scale); FloatUtil.multMatrix(model, rotation); FloatUtil.multMatrix(model, translation); ... FloatUtil.multMatrix(mvp, model); FloatUtil.multMatrix(mvp, view); FloatUtil.multMatrix(mvp, projection);I should have done FloatUtil.multMatrix(scale, model, model); FloatUtil.multMatrix(rotation, model, model); FloatUtil.multMatrix(translation, model, model); ... FloatUtil.multMatrix(model, mvp, mvp); FloatUtil.multMatrix(view, mvp, mvp); FloatUtil.multMatrix(projection, mvp, mvp); Someone here to confirm and maybe explain ? |
Administrator
|
I'll give it a look very soon...
Julien Gouesse | Personal blog | Website
|
In reply to this post by Kraft
FloatUtil.multMatrix(A, B, C) is A*B=C FloatUtil.multMatrix(A, B) is A*=B, or A = A*B mvp must be equal to projection*view*model you can optimize this code FloatUtil.multMatrix(model, mvp, mvp); FloatUtil.multMatrix(view, mvp, mvp); FloatUtil.multMatrix(projection, mvp, mvp); to this FloatUtil.multMatrix(projection, view, mvp); FloatUtil.multMatrix(mvp, model); You can avoid setting mvp to identity, since the first multMatrix will overwrite automatically whatever is in mvp |
Free forum by Nabble | Edit this page |