将矩阵传递给glsl只是不起作用?

时间:2011-12-08 03:06:39

标签: opengl glsl lwjgl

我目前正在使用lwjgl并编程glsl 1.20。

尝试将4x4浮点矩阵发送到着色器的代码如下所示:

    int normalMatrixLocation = ARBShaderObjects.glGetUniformLocationARB(handlers.ShaderHandler.get().getShader("sphere"), "normalMatrix");
    tempFloatBuffer = BufferUtils.createFloatBuffer(16);
    tempFloatBuffer.put(helpers.Matrix.doubleToFloat4x4(normalMatrix.getArray()));
    tempFloatBuffer.rewind();
    ARBShaderObjects.glUniformMatrix4ARB(normalMatrixLocation, false, tempFloatBuffer);

助手功能如下所示:

    public static float[] doubleToFloat4x4(double[][] dArray) {
        float[] newFloat = new float[16];
        for(int i = 0; i < 4; i++) {
            for (int j = 0; j < 4; j++) {
                newFloat[j+4*i] = (float)dArray[i][j];
            }
        }
        return newFloat;
    }

在着色器中我有以下内容,以便我可以使用它来着色器不同的功能:

uniform mat4 normalMatrix;

虽然这种制服总是空的4x4矩阵......

我做错了什么?

2 个答案:

答案 0 :(得分:3)

uniform mat4x4 matrixName;

据我所知,它是'mat4x4'而不是'mat4'。

另外,发送float缓冲区需要使用bytebuffer和ByteOrder类。我的代码如下:

 qbuffer.rewind();

    ByteBuffer temp = ByteBuffer.allocateDirect(64);
    temp.order(ByteOrder.nativeOrder());

    int qLocation = ARBShaderObjects.glGetUniformLocationARB(shaderProgram, "q");
    ARBShaderObjects.glUniformMatrix4ARB(qLocation, 
false, (FloatBuffer)temp.asFloatBuffer().put(qbuffer).flip());

令人费解,是的,但它可以确保本地订单。

答案 1 :(得分:0)

glUniform函数会影响当前程序。确保在调用glUniform之前调用glUseProgramARB(myProgramObj)。