OpenGL 2D投影矩阵不绘制任何东西
OpenGL 2D projection matrix not drawing anything
我正在使用 OpenGL 进行 2D 渲染,并希望使用实际像素坐标。这样,我的意思是我希望 (0,0) 位于 window 的左上角,而 (width,height) 位于 window 的右下角(其中 width和高度是 window 的尺寸(以像素为单位)。为此,我使用了一个由 glOrtho 生成的投影矩阵,然后传递给顶点着色器:
GL11.glViewport(0, 0, width, height);
GL11.glDisable(GL11.GL_DEPTH_TEST);
GL11.glMatrixMode(GL11.GL_PROJECTION);
GL11.glOrtho(0f, width, height, 0f, -1f, 1f);
GL11.glGetFloat(GL11.GL_PROJECTION_MATRIX, projectionBuffer);
GL11.glLoadIdentity();
我正在使用 LWJGL,它没有 glm 的绑定,所以我使用上面的 OpenGL 调用获得了一个二维正交矩阵。我重置了投影矩阵,因此它不会影响我以后的绘制调用。在此之后,projectionBuffer
,一个FloatBuffer
,被glOrtho
.
生成的投影矩阵填充
生成的投影矩阵是这样的(不知道有没有用):
0.0015625 0.0 0.0 1.0
0.0 -0.0027777778 0.0 -1.0
0.0 0.0 -1.0 0.0
0.0 0.0 0.0 1.0
我的顶点着色器看起来像这样:
#version 330 core
layout (location = 0) in vec4 vertex;
out vec2 TexCoords;
uniform mat4 model;
uniform mat4 projection = mat4(1.0);
void main()
{
TexCoords = vertex.zw;
gl_Position = projection * model * vec4(vertex.x, vertex.y, 0.0, 1.0);
}
当我初始化着色器时,我使用glUniformMatrix4
来设置投影矩阵的值。我确定这是成功完成的,因为当我之后使用 glGetUniform 时,它 returns 相同的投影矩阵。
模型矩阵是在绘制每一个带纹理的四边形时产生的。每个四边形共享相同的顶点和 uv,它们都存储在同一 VAO 中的单个 VBO 中。顶点数据在绘制的每个四边形之间共享,每个四边形应用不同的模型矩阵。正确计算模型矩阵以生成真实的屏幕坐标。例如,左上角位于 (0,0) 且 width/height 为 128 的正方形将生成以下模型矩阵:
128.0 0.0 0.0 0.0
0.0 128.0 0.0 0.0
0.0 0.0 1.0 0.0
0.0 0.0 0.0 1.0
此模型矩阵已使用 glUniformMatrix4
成功传递给着色器,我已经检查过了。
要使用四边形的顶点数据初始化共享 VAO,我使用以下代码:
vao = GL30.glGenVertexArrays();
int vbo = GL15.glGenBuffers();
GL30.glBindVertexArray(vao);
GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo);
GL15.glBufferData(GL15.GL_ARRAY_BUFFER, QUAD_BUFFER, GL15.GL_STATIC_DRAW);
GL20.glEnableVertexAttribArray(0);
GL20.glVertexAttribPointer(0, 4, GL11.GL_FLOAT, false, 16, 0);
GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
GL30.glBindVertexArray(0);
QUAD_BUFFER
指的是一个包含顶点和纹理坐标数据的float[]
。
最后,要绘制带纹理的四边形,我使用以下方法:
shader.setMatrix4f("model", model);//Makes a call to glUniformMatrix4 - model is the model matrix as explained above.
GL13.glActiveTexture(GL13.GL_TEXTURE0);
texture.bind();
GL30.glBindVertexArray(vao);
GL11.glDrawArrays(GL11.GL_TRIANGLES, 0, 6);
问题是,当我运行应用程序时,window上没有绘制任何东西;它仍然是完全黑色的。当不使用着色器时,我可以使用旧方法(glBegin
等)绘制形状。我不知道我做错了什么。
非常感谢 java- 游戏论坛上的某个人,我能够解决这个问题。他向我指出,调用 glOrtho 会修改加载的现有矩阵,因此我需要做的就是在调用 glOrtho 之前调用 glLoadIdentity。无论如何,我现在已经切换到使用 glm 的 java 端口进行这些计算。
我正在使用 OpenGL 进行 2D 渲染,并希望使用实际像素坐标。这样,我的意思是我希望 (0,0) 位于 window 的左上角,而 (width,height) 位于 window 的右下角(其中 width和高度是 window 的尺寸(以像素为单位)。为此,我使用了一个由 glOrtho 生成的投影矩阵,然后传递给顶点着色器:
GL11.glViewport(0, 0, width, height);
GL11.glDisable(GL11.GL_DEPTH_TEST);
GL11.glMatrixMode(GL11.GL_PROJECTION);
GL11.glOrtho(0f, width, height, 0f, -1f, 1f);
GL11.glGetFloat(GL11.GL_PROJECTION_MATRIX, projectionBuffer);
GL11.glLoadIdentity();
我正在使用 LWJGL,它没有 glm 的绑定,所以我使用上面的 OpenGL 调用获得了一个二维正交矩阵。我重置了投影矩阵,因此它不会影响我以后的绘制调用。在此之后,projectionBuffer
,一个FloatBuffer
,被glOrtho
.
生成的投影矩阵是这样的(不知道有没有用):
0.0015625 0.0 0.0 1.0
0.0 -0.0027777778 0.0 -1.0
0.0 0.0 -1.0 0.0
0.0 0.0 0.0 1.0
我的顶点着色器看起来像这样:
#version 330 core
layout (location = 0) in vec4 vertex;
out vec2 TexCoords;
uniform mat4 model;
uniform mat4 projection = mat4(1.0);
void main()
{
TexCoords = vertex.zw;
gl_Position = projection * model * vec4(vertex.x, vertex.y, 0.0, 1.0);
}
当我初始化着色器时,我使用glUniformMatrix4
来设置投影矩阵的值。我确定这是成功完成的,因为当我之后使用 glGetUniform 时,它 returns 相同的投影矩阵。
模型矩阵是在绘制每一个带纹理的四边形时产生的。每个四边形共享相同的顶点和 uv,它们都存储在同一 VAO 中的单个 VBO 中。顶点数据在绘制的每个四边形之间共享,每个四边形应用不同的模型矩阵。正确计算模型矩阵以生成真实的屏幕坐标。例如,左上角位于 (0,0) 且 width/height 为 128 的正方形将生成以下模型矩阵:
128.0 0.0 0.0 0.0
0.0 128.0 0.0 0.0
0.0 0.0 1.0 0.0
0.0 0.0 0.0 1.0
此模型矩阵已使用 glUniformMatrix4
成功传递给着色器,我已经检查过了。
要使用四边形的顶点数据初始化共享 VAO,我使用以下代码:
vao = GL30.glGenVertexArrays();
int vbo = GL15.glGenBuffers();
GL30.glBindVertexArray(vao);
GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo);
GL15.glBufferData(GL15.GL_ARRAY_BUFFER, QUAD_BUFFER, GL15.GL_STATIC_DRAW);
GL20.glEnableVertexAttribArray(0);
GL20.glVertexAttribPointer(0, 4, GL11.GL_FLOAT, false, 16, 0);
GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
GL30.glBindVertexArray(0);
QUAD_BUFFER
指的是一个包含顶点和纹理坐标数据的float[]
。
最后,要绘制带纹理的四边形,我使用以下方法:
shader.setMatrix4f("model", model);//Makes a call to glUniformMatrix4 - model is the model matrix as explained above.
GL13.glActiveTexture(GL13.GL_TEXTURE0);
texture.bind();
GL30.glBindVertexArray(vao);
GL11.glDrawArrays(GL11.GL_TRIANGLES, 0, 6);
问题是,当我运行应用程序时,window上没有绘制任何东西;它仍然是完全黑色的。当不使用着色器时,我可以使用旧方法(glBegin
等)绘制形状。我不知道我做错了什么。
非常感谢 java- 游戏论坛上的某个人,我能够解决这个问题。他向我指出,调用 glOrtho 会修改加载的现有矩阵,因此我需要做的就是在调用 glOrtho 之前调用 glLoadIdentity。无论如何,我现在已经切换到使用 glm 的 java 端口进行这些计算。