opengl - OpenGL中的正交投影矩阵问题

标签 opengl glsl shader perspectivecamera orthographic

我尝试使用正交投影矩阵渲染场景,但没有成功。

这是我的顶点着色器:

#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 设置正交投影。显式设置近平面和远平面,并使用与设置透视投影时相同的近平面和远平面。
此外,立方体在视口(viewport)上的投影只是一个小点。更改观看音量:

float scale = 1.0f;
float aspect = static_cast<float>(width) / static_cast<float>(height);
glm::ortho(-aspect * scale, aspect * scale, -scale, scale, zNear, zFar);

如果 View 矩形太小,您可以使用scale进行调整。

关于opengl - OpenGL中的正交投影矩阵问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61988774/

相关文章:

java - 如何在不同的墙壁上放置不同的纹理?陆万金GL

c++ - mac 上的 OpenGL 版本

ios - 如何在 iOS 的 GLSL 中定义一个简单的函数?

directx - 如何从 3dsMax 导出 .3ds 文件以使用 RenderMonkey?

opengl - 为什么我的 OpenGL Phong 着色器表现得像平面着色器?

javascript - WebGL 着色器根据鼠标位置为纹理着色

c++ - 在 OpenGL 太阳系中创建星星

opengl - 渲染字体时使用texelFetch是不是更快?

c++ - 从 C++ 到 OpenGL 的数据复制适用于自定义容器,但不适用于 std::tuple

Vulkan 中的 OpenGL GLSL 原子计数器