Copy link to clipboard
Copied
Hi everyone,
Maybe someone can help me:
I have successfully run the GLator sample plugin, and modified it to display a different layer (user selects a layer in the UI, the plugin checkouts out the layer and passes it to OpenGL to display it).
It works fine, however, I also want OpenGL to display the selected layer with its transform data (position, scale, rotation etc), even if it is 3D.
Here is the code I've modified inside of the RenderGL() method.
.....
// view matrix, mimic windows coordinates
vmath::Matrix4 ModelviewProjection = vmath::Matrix4::translation(vmath::Vector3(-1.0f, -1.0f, 0.0f)) * vmath::Matrix4::scale(vmath::Vector3(2.0 / float(widthL), 2.0 / float(heightL), 1.0f));
vmath::Matrix4 transformMatrix = A_Matrix4ToMatrix4(layerTransformMatrix4x4);
vmath::Matrix4 resultMatrix = ModelviewProjection * transformMatrix;
glBindTexture(GL_TEXTURE_2D, inputFrameTexture);
glUseProgram(renderContext->mProgramObjSu);
// program uniforms
GLint location = glGetUniformLocation(renderContext->mProgramObjSu, "ModelviewProjection");
glUniformMatrix4fv(location, 1, GL_FALSE, (GLfloat*)&resultMatrix);
.....
Explanation:
layerTransformMatrix4x4 is the transform matrix of the selected layer, that was retrieved using AEGP_GetLayerToWorldXform(). It contains all the transform data, even 3D. I then transform the matrix into a column matrix using A_Matrix4ToMatrix4(), and multiplied it with the ModelViewProjection matrix. The result is then passed to the vertex shader.
The problem: it works fine for 2d translations, however 3d translations (with a different Z) results in a transparent layer. It does not draw anything!
Am I missing something ?
Thanks
Ok so I've managed to get it work !
The problem was that I was not multiplying the view matrix and the projection matrix in the correct order.
It should be
modelViewProjectionMatrix = projectionMatrix * modelViewMatrix;
in this order !
Copy link to clipboard
Copied
did you check the content of resultMatrix on the 3D layer case? is any of the diagonal scale matrix entries a zero?
Copy link to clipboard
Copied
Here are the content of the matrices if the Z position of the 3D layer is set to 50.0 (the other values are unchanged) :
> Model View Projection:
0.000488281250 0.0 0.0 -1.0
0.0 0.000748783234 0.0 -1.0
0.0 0.0 1.0 0.0
0.0 0.0 0.0 1.0
> transformMatrix (the transform matrix of the selected layer) :
1.0 0.0 0.0 0.0
0.0 1.0 0.0 0.0
0.0 0.0 1.0 50.0
0.0 0.0 0.0 1.0
> resultMatrix (which is sent to the vertex shader) :
0.000488281250 0.0 0.0 -1.0
0.0 0.000748783234 0.0 -1.0
0.0 0.0 1.0 50.0
0.0 0.0 0.0 1.0
Copy link to clipboard
Copied
can you show the same matrices for a 2D trasnformation where the render is correct?
Copy link to clipboard
Copied
Ok here are the content of the matrices for a translation on X axis of 50 pixels (other values unchanged):
> Model View Projection:
0.000488281250 0.0 0.0 -1.0
0.0 0.000748783234 0.0 -1.0
0.0 0.0 1.0 0.0
0.0 0.0 0.0 1.0
> transformMatrix (the transform matrix of the selected layer) :
1.0 0.0 0.0 50.0
0.0 1.0 0.0 0.0
0.0 0.0 1.0 0.0
0.0 0.0 0.0 1.0
> resultMatrix (which is sent to the vertex shader) :
0.000488281250 0.0 0.0 -0.975585938
0.0 0.000748783234 0.0 -1.0
0.0 0.0 1.0 0.0
0.0 0.0 0.0 1.0
I was wondering if its not an issue related to the camera frustum ?
Copy link to clipboard
Copied
it might be related to the frustum, but i also see the matrices don't contain any perspecitve info (f.o.v).
i'm not too versed in openGL, is that added by some other call?
Copy link to clipboard
Copied
Ok so after some documentation, I figured out that OpenGL only draws the shapes that are contained in the camera frustum. So any shape whose coordinates are outside of the (-1,-1) clip limits is not drawn (that's why the first modelViewProjection matrix posted in this thread was wrong).
The modelViewProjection matrix provided in the GLator sample plugin is made like this :
2/width 0 0 -1
0 2/height 0 -1
0 0 1 0
0 0 0 1
So no information about the camera frustrum, or the Z position of the camera.
I tried to modify this matrix using this formula (found on internet) to include the far clipping plane, and the near clipping plane:
2/width 0 0 -1
0 2/height 0 -1
0 0 -1 / (far - near) -(far + near) / (far - near)
0 0 0 1
but... nothing, the render is still empty. Does anyone have an idea, or an example of code that works ?
Thanks a lot
Copy link to clipboard
Copied
Ok so I've managed to get it work !
The problem was that I was not multiplying the view matrix and the projection matrix in the correct order.
It should be
modelViewProjectionMatrix = projectionMatrix * modelViewMatrix;
in this order !