opengl - 使用 GLM 正交投影矩阵将三角形顶点放在错误的位置
问题描述
最近,我正在尝试使用 OpenGL 在我的窗口内容视图 (OSX NSView) 中渲染一个三角形(如图 1),我使用 GLM 库函数 glm::ortho 进行“正交投影”,在渲染后,三角形的顶点都在错误的位置,它们似乎与窗口内容视图有偏移。
我有两个问题:
我是否误解了 glm::ortho(基于以下代码)?
当窗口调整大小(放大,缩小)时,如何保持三角形在窗口中保持相同的位置(即顶部顶点在宽度中间,底部顶点在角落)?
结果如下:
我的渲染功能:
- (void)render
{
float view_width = self.frame.size.width;
float view_height = self.frame.size.height;
glViewport(0, 0, view_width, view_height);
glClearColor(0.0, 0.0, 0.0, 1.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// Using Orthographic Projection Matrix, vertex position
// using view coordinate(pixel coordinate)
float positions[] = {
0.0f, 0.0f, 0.0f, 1.0f,
view_width, 0.0f, 0.0f, 1.0f,
view_width/(float)2.0, view_height, 0.0f, 1.0f,
};
glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(positions), positions);
glm::mat4 p = glm::ortho(0.0f, view_width, 0.0f, view_height);
glm::mat4 v = glm::lookAt(glm::vec3(0, 0, 1), glm::vec3(0, 0, 0), glm::vec3(0, 1, 0));
glm::mat4 m = glm::mat4(1.0f);
// upload uniforms to shader
glUniformMatrix4fv(_projectionUniform, 1, GL_FALSE, &p[0][0]);
glUniformMatrix4fv(_viewUniform, 1, GL_FALSE, &v[0][0]);
glUniformMatrix4fv(_modelUniform, 1, GL_FALSE, &m[0][0]);
glDrawElements(GL_TRIANGLE_STRIP, sizeof(positions) / sizeof(positions[0]),GL_UNSIGNED_SHORT, 0);
[_openGLContext flushBuffer];
}
我的顶点着色器:
#version 410
in vec4 position;
uniform highp mat4 projection;
uniform highp mat4 view;
uniform highp mat4 model;
void main (void)
{
gl_Position = position * projection * view * model;
}
解决方案
矩阵的glm
初始化方式与 GLSL 矩阵相同。有关详细信息,请参阅第 101 页的 OpenGL 着色语言 4.6、5.4.2 矢量和矩阵构造函数。
一个向量必须从右边乘以矩阵。
请参阅GLSL 编程/向量和矩阵运算:
请注意,向量必须从右侧乘以矩阵。
如果一个向量从左边乘以一个矩阵,结果对应于从左边乘一个行向量到矩阵。这对应于从右侧将列向量与转置矩阵相乘。
这意味着您必须在顶点着色器中更改顶点变换:
gl_Position = position * projection * view * model;
gl_Position = projection * view * model * position;
推荐阅读
- firebase - Cloud Functions:从 Cloud Storage 压缩多个文档
- docker - 使用 containerd 在 Kubernetes 中运行 docker
- spring-webflux - 当 Flux 为空时返回 404
- c# - C# 编码最佳实践
- python - 访问嵌套在列表中的字典中的值
- python - Python 如何随机打乱 100,000 个项目的列表?
- python-3.x - 如何从 Python 3.x 中的字节读取 zipfile?
- loops - 连通图中的环路检测
- twitter-bootstrap-3 - 防止 Bootstrap-3 网格在移动设备上中断
- debugging - 握手失败 - 连接过早关闭