统一变量使用jogl显示黑屏

时间:2016-12-06 22:57:52

标签: opengl glsl jogl

我使用jogl拼凑了一个基本的游戏引擎,并且在访问和/或更新我的着色器代码中的统一变量时遇到了相当大的障碍。

以下是我分配Matrix和相关缓冲区的方法:

protected float[] test_matrix = {
    1.0f, 0.0f, 0.0f, 1.0f,
    0.0f, 1.0f, 0.0f, 1.0f,
    0.0f, 0.0f, 1.0f, 1.0f,
    0.0f, 0.0f, 0.0f, 1.0f
};
protected int matrix_size = test_matrix.length;

FloatBuffer matrix_buffer = Buffers.newDirectFloatBuffer(test_matrix, 0, matrix_size);

以下是相关代码:

shaderProgram = gl.glCreateProgram();
gl.glAttachShader(shaderProgram, vertShader);
gl.glAttachShader(shaderProgram, fragShader);

pmvmatrix = new PMVMatrix();
transmatrix_location = gl.glGetUniformLocation(shaderProgram, "transformationMatrix");
gl.glUniformMatrix4fv(transmatrix_location, 400, false, matrix_buffer);

pmvmatrix.glMatrixMode(GLMatrixFunc.GL_MODELVIEW);
pmvmatrix.glLoadIdentity();

gl.glBindAttribLocation(shaderProgram, 0, "position");
gl.glBindAttribLocation(shaderProgram, 1, "color");

gl.glLinkProgram(shaderProgram);

这是我的顶点着色器:

#version 400 core

in vec3 position;

out vec3 color;

uniform mat4 transformationMatrix;

void main(void){
    gl_Position = transformationMatrix * vec4(position,1.0);
    color = vec3(position.x+0.5,1.0,position.y+0.5);
}

着色器正在成功编译,如果我删除了" transformationMatrix *"在我的顶点着色器中,对象正确呈现。

我的矩阵是作为1X16矩阵而不是4X4传递的吗?我是否正确使用了glUniformMatrix4fv函数?

1 个答案:

答案 0 :(得分:2)

transmatrix_location = gl.glGetUniformLocation(shaderProgram, "transformationMatrix");
...
gl.glLinkProgram(shaderProgram);

错误的方式。 Link, then Get

  

...分配给统一变量的实际位置未知   直到程序对象成功链接。连接后有   发生了,命令glGetUniformLocation可以用来获取   统一变量的位置。 ...