当前位置: 首页 > 知识库问答 >
问题:

OpenGL 2D投影矩阵,不绘制任何内容

微生欣怡
2023-03-14

我使用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正交矩阵。我重置了投影矩阵,这样它就不会影响我以后的绘图调用。在此之后,投影缓冲区,一个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);
}

当我初始化着色器时,我使用< code>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);

< code>QUAD_BUFFER引用包含顶点和纹理坐标数据的< code>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等)绘制形状。我不知道我做错了什么。

共有1个答案

王辉
2023-03-14

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

 类似资料:
  • 我有一个基本的OpenGL应用程序,我想使用我的投影矩阵。 这是我的矩阵: (WorldCoordinates是Matrix4结构,它只包含一个名为m的变量,即浮点[4][4])(宽度和高度是两个s)。然后,我使用以下方法将此坐标应用于我的<code>顶点 (Shader是一个类,并且有一个绑定()方法,它只是glUseProgram)。 这是我的顶点着色器GLSL 使用这个,它不起作用。但将gl

  • 本章节主要给大家引入视图矩阵和投影矩阵两个新的概念,如果你没有图形学基础,对这两个概念暂时还没有认知,也没有关系。通过前面的学习相信你对平移、旋转等矩阵有了一定的认知,至于投影和视图矩阵和平移、旋转等模型矩阵一样也会对WebGL顶点进行坐标变换,至于如何变换下面会逐步讲解。 在学习本章节之前,如果你对Three.js已经有了一定的了解,可以尝试从WebGL视图矩阵和投影矩阵的角度去深入理解Thre

  • 问题内容: 我试图在OpenGL中使用gluUnProject,首先我需要获取projectoin,model_view和viewort矩阵。根据我在网上找到的例子 但是我收到错误消息“ ValueError:glGetFloatv需要1个参数(pname),收到2:(GL_PROJECTION_MATRIX,[])” 那么,我应该使用什么来获取这些矩阵? 问题答案: 也许: 之后在变量中应该是投

  • 基本上,我的代码是这样的: 我有一个名为cam的正交相机和一个名为batch的sprite批处理。 我想要的是要在 InputProcessor 类中创建一个矩形,该矩形与使用子画面批处理绘制的纹理区域具有相同的 x、y、宽度和高度,以便我可以触摸检测该纹理。 但是当我用“Rock.getTextureRegion.y”或“x”作为我的Bounds矩形的参数时,边界就大不相同了。 是因为那个输入类

  • 我想在图像空间中把3D点转换成2D点。根据hartley和zisserman的《多视图几何学》一书,我们用DLT计算摄像机射影矩阵只需要6个点,我做到了。有了矩阵,我能够准确地重新投影点。 虽然投影矩阵工作正常,但从投影矩阵中提取的固有参数却不正常,每次都相差很小mm。 下面是我能够提取的内在参数的示例 谢谢你。

  • 问题内容: 我在应用程序中使用以下绘画工具: 我设置了一个,用于在我的XML中保留用于绘制的画布: 我在内部调用以获取使用户能够使用的视图: 我有不同的颜色选项,用户可以从改变油漆笔触颜色的选择我之内: 除了我每次选择一种新的颜色外,其他所有东西都工作正常,以前绘制的任何内容也将更改为新选择的颜色。无论接下来选择什么新颜色,如何保持以前绘制的内容不变? 问题答案: 您将为每个TouchEvent添