我目前在我的enigne中实现矩阵。使用标准的glTranslate和glRotate,然后在着色器中使用ftransform()。手动完成。
我如何将黑客赋予着色器:
public static void loadMatrix(int location, Matrix4f matrix)
{
FloatBuffer buffer = BufferUtils.createFloatBuffer(16);
matrix.store(buffer);
buffer.flip();
glUniformMatrix4(location, false, buffer);
}
发送viewMatrix:
shaderEngine.loadMatrix(glGetUniformLocation(shaderEngine.standard, "viewMatrix"), camera.viewMatrix);
shaderEngine.loadMatrix(glGetUniformLocation(shaderEngine.obj, "viewMatrix"), camera.viewMatrix);
System.out.println(camera.viewMatrix.toString());
在着色器中我得到它:
uniform mat4 viewMatrix;
并在着色器主要设置碎片颜色:
gl_FragColor = vec4(viewMatrix[0][3] / -256,0,0,1);
哪个是BLACK(所以viewMatrix [0] [3] == 0),而我在java中的矩阵输出如下所示:
1.0 0.0 0.0 -128.0
0.0 1.0 0.0 -22.75
0.0 0.0 1.0 -128.0
0.0 0.0 0.0 1.0
答案 0 :(得分:1)
您的困惑似乎来自数组下标如何处理GLSL中矩阵的元素。第一个下标是列,第二个是行。
因此,除非您转置矩阵,否则第1列第4行== 0.0 。
如果您转置矩阵或交换下标,您将获得 -128.0 。
顺便说一下,glUniformMatrix4 (...)
调用中的第二个参数允许你在GLSL获得它之前转置矩阵。这将允许您将所有内容视为行专业,如果这对您来说更自然。
答案 1 :(得分:0)
我的问题是,当使用的程序为0时,我正在给着色器发送矩阵。