【发布时间】:2017-03-04 23:54:25
【问题描述】:
我使用的是 opengl 2.1 版、glsl 120、lwjgl 3。 每当我调用 GL20.glUniformMatrix4fv() 时,着色器程序都无法识别它。调试完所有着色器和程序后,不返回任何错误。
一个立方体被绘制到窗口上(因为没有投影,它显示为一个四边形)。 编译没有错误并且可以工作的着色器程序:
#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 仍然没有任何东西被绘制到屏幕上。当单位矩阵被发送到 proj 然后乘以 vec4 立方体消失了。
检查:
GL20.glGetShaderiv(vertexID, GL20.GL_ACTIVE_UNIFORMS, success);
在顶点着色器中返回零 检查时:
GL20.glGetProgramiv(shaderID, GL20.GL_ACTIVE_UNIFORMS, success);
在 main 方法中使用 proj 和 modelView 时,shader 程序中返回 1 或 2。
[已解决的更新] 正在使用获取属性位置而不是获取统一位置。
【问题讨论】:
-
projection.get是做什么的? lwjgl Matrix4f 类不提供此功能 -
LWJGL 版本 3 去掉了所有的矩阵数学。我正在使用 JOML,Java opengl 数学库。每当您在矩阵上调用 get 方法时,它将返回该矩阵中的任何内容并将其放入缓冲区中,这是 opengl 对其大多数功能所需的数据结构。
-
buffer是 16 浮点缓冲区吗?你真的应该创建一个 MVCE,否则我们只能猜测问题出在哪里。 -
缓冲区是一个 16 浮点缓冲区。
标签: java opengl glsl lwjgl uniform