C++ 基于现代OpenGL的二维正交投影绘制
我正在尝试将我不久前编写的一个老SDL游戏移植到3.3+OpenGL,我在获取正确的正交矩阵及其相应视图时遇到了一些问题C++ 基于现代OpenGL的二维正交投影绘制,c++,opengl,opengl-es,sdl,orthogonal,C++,Opengl,Opengl Es,Sdl,Orthogonal,我正在尝试将我不久前编写的一个老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); 我什么也得不到。即使在将四边形放置在中心时,如果我将视图居中,也是一样的: glm::mat4 view = glm::lo
glm::mat4 proj = glm::ortho( 0.0f, static_cast<float>(win_W), static_cast<float>(win_H), 0.0f,-5.0f, 5.0f);
我什么也得不到。即使在将四边形放置在中心时,如果我将视图居中,也是一样的:
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
);
不幸的是,我正在学习的源代码(ArcSynthesis书)没有涵盖涉及默认NDC以外的坐标系的视图。出于某种原因,甚至在今天,关于opengl的大多数讨论都是关于不推荐的版本。
简而言之,在现代opengl中,为简单的2D渲染设置正交投影矩阵视图的最佳方法是什么?您的查找调用实际上毫无意义,因为您的
向上
向量(0,0,1)与查看方向(0,0,-1)共线。这将不会生成可用的矩阵
您可能希望(0,1,0)作为up
vector。然而,即使你改变了这一点,你也可能会对结果感到惊讶。结合设置的投影矩阵,指定为注视目标的点将不会显示在屏幕的中心,而是显示在屏幕的角落。您的投影不会将(0,0)映射到中心,这通常是在使用某些LookAt
功能时假定的
我同意三十二上校的意见:在这种情况下不要使用
LookAt
,除非你有很好的理由这样做。我不想麻烦使用LookAt
进行2D渲染;平移和缩放矩阵要简单得多,效果也很好。过去几天我一直在断断续续地研究同样的问题。从OpenGL2.1到OpenGL3.x的2D游戏有什么真正的好处吗?
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
);
#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;
}