繁体   English   中英

OpenGL 2D投影矩阵没有绘制任何东西

[英]OpenGL 2D projection matrix not drawing anything

我正在使用OpenGL进行2D渲染,并希望使用实际的像素坐标。 这个,我的意思是我希望(0,0)位于窗口的左上角,(宽度,高度)位于窗口的右下角(宽度和高度是窗口的尺寸,以像素为单位) )。 为此,我使用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调用获得了2D正交矩阵。 我重置了投影矩阵,因此它不会影响我以后的绘制调用。 在此之后, 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之后,它会返回相同的投影矩阵。

当要绘制每个纹理四边形时,产生模型矩阵。 每个四边形共享相同的顶点和uv,它们都存储在同一个VAO中的单个VBO中。 顶点数据在绘制的每个四边形之间共享,每个四边形应用不同的模型矩阵。 正确计算模型矩阵以产生真实的屏幕坐标。 例如,其左上角为(0,0)且宽度/高度为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);

问题是,当我运行应用程序时,窗口上没有任何内容; 它仍然是完全黑的。 不使用着色器时,我可以使用旧方法( glBegin等)绘制形状。 我无法弄清楚我做错了什么。

我能够在java游戏论坛上非常感谢有人解决这个问题。 他向我指出,调用glOrtho会修改加载的现有矩阵,所以我需要做的就是在进行glOrtho调用之前调用glLoadIdentity。 无论如何,我已经切换到使用glm的java端口进行这些计算。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM