OpenGL 中的正交投影矩阵问题
Orthographic projection matrix issue in OpenGL
我尝试使用正交投影矩阵渲染场景,但没有成功。
这是我的顶点着色器:
#version 330 core
layout (location = 0) in vec3 position;
uniform mat4 model;
uniform mat4 view;
uniform mat4 projection;
void main() {
gl_Position = projection * view * model * vec4(position, 1.0f);
}
这是我的片段着色器:
#version 150
uniform vec3 color;
out vec4 out_color;
void main() {
out_color = vec4(color, 1.0);
}
这是我的渲染代码:
shader.setUniform("projection", projection);
shader.setUniform("view", view);
shader.setUniform("model", model);
shader.setUniform("color", color);
glBindVertexArray(vao);
glEnableVertexAttribArray(0);
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
glDrawElements(GL_TRIANGLES, 36, GL_UNSIGNED_SHORT, nullptr);
现在如果我用作投影矩阵:
glm::perspective(glm::radians(fov), width/(float)height, zNear, zFar);
一切正常,我看到了立方体。但是如果我使用这个:
glm::ortho(0.0f, static_cast<float>(width), 0.0f, static_cast<float>(height));
立方体不见了。
我错过了什么?
很可能立方体被投影的远平面裁剪了。如果您通过
设置投影
glm::ortho(0.0f, static_cast<float>(width), 0.0f, static_cast<float>(height));
则近平面为-1,远平面为1。不在近平面和远平面之间的所有几何体都被裁剪。
通过glm::ortho
设置正投影。明确设置近平面和远平面,并使用与设置透视投影时相同的近平面和远平面。
此外,立方体在视口上的投影只是一个小点。更改观看音量:
float scale = 1.0f;
float aspect = static_cast<float>(width) / static_cast<float>(height);
glm::ortho(-aspect * scale, aspect * scale, -scale, scale, zNear, zFar);
如果视图矩形太小,可以使用scale
进行调整。
我尝试使用正交投影矩阵渲染场景,但没有成功。
这是我的顶点着色器:
#version 330 core
layout (location = 0) in vec3 position;
uniform mat4 model;
uniform mat4 view;
uniform mat4 projection;
void main() {
gl_Position = projection * view * model * vec4(position, 1.0f);
}
这是我的片段着色器:
#version 150
uniform vec3 color;
out vec4 out_color;
void main() {
out_color = vec4(color, 1.0);
}
这是我的渲染代码:
shader.setUniform("projection", projection);
shader.setUniform("view", view);
shader.setUniform("model", model);
shader.setUniform("color", color);
glBindVertexArray(vao);
glEnableVertexAttribArray(0);
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
glDrawElements(GL_TRIANGLES, 36, GL_UNSIGNED_SHORT, nullptr);
现在如果我用作投影矩阵:
glm::perspective(glm::radians(fov), width/(float)height, zNear, zFar);
一切正常,我看到了立方体。但是如果我使用这个:
glm::ortho(0.0f, static_cast<float>(width), 0.0f, static_cast<float>(height));
立方体不见了。
我错过了什么?
很可能立方体被投影的远平面裁剪了。如果您通过
设置投影glm::ortho(0.0f, static_cast<float>(width), 0.0f, static_cast<float>(height));
则近平面为-1,远平面为1。不在近平面和远平面之间的所有几何体都被裁剪。
通过glm::ortho
设置正投影。明确设置近平面和远平面,并使用与设置透视投影时相同的近平面和远平面。
此外,立方体在视口上的投影只是一个小点。更改观看音量:
float scale = 1.0f;
float aspect = static_cast<float>(width) / static_cast<float>(height);
glm::ortho(-aspect * scale, aspect * scale, -scale, scale, zNear, zFar);
如果视图矩形太小,可以使用scale
进行调整。