【问题标题】:Can't give Matrix to Shader as uniform不能将矩阵作为统一的着色器提供给着色器
【发布时间】:2014-09-20 23:05:50
【问题描述】:

我目前正在我的 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);

这是黑色的(所以 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

【问题讨论】:

    标签: opengl matrix shader lwjgl


    【解决方案1】:

    您的困惑似乎来自于数组下标如何处理 GLSL 中的矩阵元素。第一个下标是列,第二个是行。

      因此,除非您转置矩阵,否则第 1 列第 4 行 == 0.0

      如果您转置矩阵或交换下标,您将得到 -128.0

    顺便说一句,调用glUniformMatrix4 (...) 中的第二个参数允许您在GLSL 得到它之前转置矩阵。如果这对您来说更自然,这将允许您将所有内容都视为行优先。

    【讨论】:

    • 所以如果访问数组的第一个参数是列,这应该是正确的:gl_FragColor = vec4(viewMatrix[3][0] / -256,0,0,1);但它仍然返回黑色,因此 viewMatrix[3][0] 为 0,viewMatrix[0][0] 也为 0;
    【解决方案2】:

    我的问题是,当使用的程序为 0 时,我将矩阵提供给着色器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多