首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OpenGL二维投影矩阵不作图

OpenGL二维投影矩阵不作图
EN

Stack Overflow用户
提问于 2017-05-14 10:23:39
回答 1查看 546关注 0票数 3

我使用OpenGL进行2D渲染,并希望使用实际的像素坐标。我的意思是,我希望(0,0)在窗口的左上角,(宽度、高度)在窗口的右下角(其中宽度和高度是窗口的尺寸(像素))。为此,我使用用glOrtho生成的投影矩阵,然后传递给顶点着色器:

代码语言:javascript
复制
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生成的投影矩阵。

生成的投影矩阵如下(我不知道这是否有用):

代码语言:javascript
复制
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

我的顶点着色器是这样的:

代码语言:javascript
复制
#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,这些顶点和uv都存储在同一个VAO中的单个VBO中。在绘制的每个四角体之间共享顶点数据,并对每个四角体应用不同的模型矩阵。正确计算模型矩阵,生成真实屏幕坐标。例如,一个正方形的左上角为(0,0),宽度/高度为128,将产生以下模型矩阵:

代码语言:javascript
复制
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,我使用以下代码:

代码语言:javascript
复制
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[]

最后,为了绘制一个纹理四角体,我使用以下内容:

代码语言:javascript
复制
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等)绘制形状。我不知道我做错了什么。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-05-14 15:15:46

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43962812

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档