c++ - 使用现代 OpenGL 进行 2D 渲染的正交投影

标签 c++ opengl opengl-es sdl orthogonal

我正在尝试将我前一段时间编写的旧 SDL 游戏移植到 3.3+ OpenGL,但我在获取正确的正交矩阵及其对应 View 时遇到了一些问题。

    glm::mat4 proj = glm::ortho( 0.0f, static_cast<float>(win_W), static_cast<float>(win_H), 0.0f,-5.0f, 5.0f);

如果我简单地使用这个投影并尝试在 win_W 和 win_H 的边界内渲染一个四边形,它就可以工作。但是,如果相反,我尝试使用以下方法模拟相机:

   glm::mat4 view = glm::lookAt(
    glm::vec3(0.0f, 0.0f, 1.0f),//cam pos
    glm::vec3(0.0f, 0.0f, 0.0f),//looking at
    glm::vec3(0.0f, 0.0f, 1.0f)//floored
);

我一无所获。即使将四边形定位在中心,如果我将 View 居中,也是一样的:

  glm::mat4 view = glm::lookAt(
    glm::vec3(static_cast<float>(win_W), static_cast<float>(winH), 1.0f),//cam pos
    glm::vec3(static_cast<float>(win_W), static_cast<float>(winH), 0.0f),//looking at
    glm::vec3(0.0f, 0.0f, 1.0f)//floored
);

考虑到SDL通常会从游戏中的顶点中减去相机值来模拟 View ,是否可以像这样在着色器中替换我的MVP操作更好:

#version 150

in vec2 position;
in vec3 color;

out vec3 Color;

uniform mat4 model;
uniform mat4 view;
uniform mat4 projection;
uniform mat4 camera;

void main()
{
Color = color;
 //faulty view
//gl_Position = projection *view * model * vec4(position, 0.0, 1.0);
//new SDL style camera
  mat4 newPosition = projection * model * vec4(position, 0.0, 1.0);
 gl_Position = newPosition - camera;
} 

不幸的是,我正在学习的资源(ArcSynthesis Book)没有涵盖涉及默认 NDC 以外的坐标系的 View 。出于某种原因,即使在今天,大多数关于 opengl 的讨论都是关于已弃用的版本。 所以简而言之,在现代 opengl 中将 View 设置为正交投影矩阵以进行简单 2D 渲染的最佳方法是什么?

最佳答案

您的查找调用实际上根本没有意义,因为您的 up vector (0,0,1) 与观察方向 (0,0,-1) 共线。这不会产生可用的矩阵。

您可能希望 (0,1,0) 作为 up vector 。但是,即使您更改了它,您也可能会对结果感到惊讶。结合您设置的投影矩阵,您指定为注视目标的点不会出现在中心,而是出现在屏幕的。您的投影不会将 (0,0) 映射到中心,这在使用某些 LookAt 函数时通常会假设。

我同意三十二上校的评论:在这种情况下不要使用 LookAt,除非你有充分的理由这样做。

关于c++ - 使用现代 OpenGL 进行 2D 渲染的正交投影,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25993464/

相关文章:

c++ - 矩阵类 Directx 和 OpenGL

linux - 在 "standard"Linux 系统上创建 OpenGL ES 2.0 上下文

java - OpenGL ES : Rotating does not seem to take Z axis into consideration?

c++ - Visual C++ 探查器按线程 ID 过滤

c++ - 当字符串保存在一个集合中时,c_str() 是否仍然有效

c++ - 在 Arduino 中除以两个整数

java - 如何在java中访问C++库(DLL)的方法

c++ - 为什么我在这段代码中得到一个 undefined reference ?

c++ - OpenGL glCreateProgram() 总是返回 1 并删除之前的程序

opengl-es - GLFW 无法加载所有 GL ES 2.0 功能