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

问题描述:

我正尝试移植一些前段时间用于3.3+ OpenGL的旧SDL游戏,并且我有几个问题得到了正确的正交矩阵,并且它是相应的视图。使用现代OpenGL进行2D渲染的正交投影

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书)学习源不包括涉及除默认NDC其他的坐标系的视图。由于某种原因,即使在今天,关于opengl的大多数讨论都是关于不推荐使用的版本。 所以简而言之,在现代opengl中,为简单的2D渲染设置正交投影矩阵的视图的最佳方式是什么?

+4

我不打扰使用'lookAt'进行2D渲染;翻译和比例矩阵要简单得多,而且工作起来也一样。 – 2014-09-23 12:42:22

+0

过去几天我一直在玩关于同样的问题。从OpenGL 2.1到2D游戏的OpenGL 3.x有没有真正的好处? – Zammalad 2014-09-23 14:44:24

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

您可能想要(0,1,0)作为up向量。但是,即使您改变了这一点,您可能会对结果感到惊讶。结合您设置的投影矩阵,您指定为查看目标的点不会出现在中心,而是出现在屏幕的角落处。您的投影不会将(0,0)映射到中心,在使用某些LookAt函数时通常会采用这种中心。

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