我使用的是opengl 2.1版,glsl 120,lwjgl 3。 每当我调用GL20.glUniformMatrix4fv()时,它都不会被着色器程序识别。调试后,所有着色器和程序都不会返回任何错误。
立方体被绘制到窗口(因为没有投影它显示为四边形)。 Shader程序编译没有错误并且有效:
#version 120
attribute vec3 position;
uniform mat4 modelView;
uniform mat4 proj;
void main()
{
gl_Position = vec4(position, 1.0); // See how we directly give a vec3 to vec4's constructor
}
没有任何东西被吸引到窗口。 着色器程序编译时没有错误,但屏幕上没有显示任何内容:
#version 120
attribute vec3 position;
uniform mat4 modelView;
uniform mat4 proj;
void main()
{
gl_Position = proj * vec4(position, 1.0); // See how we directly give a vec3 to vec4's constructor
}
片段着色器:
#version 120
void main()
{
gl_FragColor = vec4(0.0, 1.0, 1.0, 1.0);
}
程序总是链接和编译,但统一项目不起作用。
这是发送统一数据的代码:
GL20.glUseProgram(shaderProgram);
int model = GL20.glGetAttribLocation(shaderProgram, "modelView");//used get attrib here instead of GL20.glGetUniformLocation();
Matrix4f modelView = new Matrix4f().translate(.5f, .5f, .5f);
GL20.glUniformMatrix4fv(model, false, modelView.get(buffer));
int proj = GL20.glGetAttribLocation(shaderProgram, "proj");//and here
Matrix4f projection = new Matrix4f().
perspective((float)Math.toRadians(45), 1.0f, 0.1f, 100f).
lookAt(0.0f, 0.0f, -3.0f, //eye
0.0f, 0.0f, 0.0f, //center
0.0f, 1.0f, 0.0f);//up
GL20.glUniformMatrix4fv(proj, false, projection.get(buffer));
//draw container
GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, VBO);
GL11.glDrawArrays(GL_TRIANGLES, 0, 36);
GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
{updated}在调用gluniformmatrix4fv之前输入gluseprogram 屏幕上还没有任何内容。当Identity矩阵被发送到proj然后再乘以vec4时,立方体就会消失。
检查:
GL20.glGetShaderiv(vertexID, GL20.GL_ACTIVE_UNIFORMS, success);
顶点着色器中的返回零 在检查时:
GL20.glGetProgramiv(shaderID, GL20.GL_ACTIVE_UNIFORMS, success);
当在main方法中使用proj和modelView时,着色器程序中的返回1或2。
[已解决更新] 使用get attrib位置而不是统一位置。
答案 0 :(得分:0)
OpenGL中的制服是每个程序状态。所有glUniform*()
函数都设置当前活动程序对象的制服。你必须先调用glUseProgram
才能设置该程序的制服。