我目前正在使用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矩阵......
我做错了什么?
答案 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)。