C++ 基于现代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

我正在尝试将我不久前编写的一个老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::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;
}