【发布时间】:2014-11-17 13:31:14
【问题描述】:
我正在尝试将我前一段时间编写的旧 SDL 游戏移植到 3.3+ OpenGL,但在获取正确的正交矩阵及其对应视图时遇到了一些问题。
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
);
我什么也得不到。即使将四边形定位在中心,如果我将视图居中,也是一样的:
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 通常会从游戏中的顶点中减去相机值来模拟视图,这样在着色器中替换我的 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 以外的坐标系的视图。出于某种原因,即使在今天,大多数关于 opengl 的讨论都是关于已弃用的版本。 简而言之,在现代 opengl 中将视图设置为正交投影矩阵以进行简单 2D 渲染的最佳方法是什么?
【问题讨论】:
-
我不会费心使用
lookAt进行 2D 渲染;平移和缩放矩阵要简单得多,而且效果也很好。 -
过去几天我一直在玩同样的问题。 2D 游戏从 OpenGL 2.1 迁移到 OpenGL 3.x 有什么真正的好处吗?
标签: c++ opengl opengl-es sdl orthogonal