OpenGL中的正交投影问题

Posted

技术标签:

【中文标题】OpenGL中的正交投影问题【英文标题】:Problem with orthographic projection in OpenGL 【发布时间】:2021-07-27 23:24:03 【问题描述】:

所以我对 OpenGL 还是很陌生,我试图创建正交投影,但问题是当我这样做时

glm::mat4 ortho;

ortho = glm::ortho(-(float)WINDOW_WIDTH / 2.0f, (float)WINDOW_WIDTH / 2.0f, -(float)WINDOW_HEIGHT / 2.0f, (float)WINDOW_HEIGHT / 2.0f, -1.f, 1.f);

它工作得很好,但是 0, 0 点在屏幕中间

我想做的事情是在窗口的左下角有 0, 0 点但是当我这样做时

glm::mat4 ortho;

ortho = glm::ortho(0.0f, (float)WINDOW_WIDTH, 0.0f, (float)WINDOW_HEIGHT, -1.0f, 1.0f);

结果是这样的

我找了这么久,所以现在我只是在寻求帮助

这些是我的矩形的顶点位置

float positions[8] =

    -100.0f, -100.0f,
     100.0f, -100.0f,
     100.0f,  100.0f,
    -100.0f,  100.0f,
;

我也使用索引缓冲区来绘制它

unsigned indices[6] =

    0, 1, 2,
    2, 3, 0
;

这些是我的缓冲区

unsigned buffer = 0;
glGenBuffers(1, &buffer);
glBindBuffer(GL_ARRAY_BUFFER, buffer);
glBufferData(GL_ARRAY_BUFFER, 8 * sizeof(float), positions, GL_STATIC_DRAW);

glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(float) * 2, 0);

unsigned ibo = 0;
glGenBuffers(1, &ibo);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, 6 * sizeof(unsigned), indices, GL_STATIC_DRAW);

它是使用绘制的

glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, nullptr);

【问题讨论】:

你的矩形顶点的第三个坐标是多少? 另外,你是如何绘制矩形的?绘制第一个米色矩形的代码是否相同? 是的,这些矩形是一样的,现在我看到我让它有点混乱,但它只是一个改变它颜色的着色器 着色器是否可能还会更改第二个三角形的颜色、正面设置或其他内容,因为看起来您确实缺少构成矩形的两个三角形之一 我只是尝试了一种纯色,在更大的窗口上看起来像这样i.imgur.com/ImMcaDL.png 【参考方案1】:

所以我做错的是在着色器中我将位置乘以正交投影而不是正交投影乘以位置

不要这样做:

gl_Position = position * u_MVP;

这样做:

gl_Position = u_MVP * position;

【讨论】:

以上是关于OpenGL中的正交投影问题的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ 中的 OpenGL 中将坐标从 3D 透视投影映射到 2D 正交投影

OpenGL - 正交投影矩阵,glViewport

OpenGL中的正交投影矩阵问题

没有 OpenGL 的重复 OpenGL 正交投影行为

OpenGL 3+,具有定向光的正交投影

使用 OpenGL 进行正交投影以及如何实现相机或物体在空间中的移动