opengl - 从透视变换到正交矩阵

标签 opengl 2d glsl orthographic

我有一个简单的三角形场景。我正在使用透视投影。我的 MVP 矩阵设置(在 GLM 的帮助下)如下:

glm::mat4 Projection = glm::perspective(45.0f, 4.0f / 3.0f, 0.1f, 100.0f);
glm::mat4 View       = glm::lookAt(
    glm::vec3(0,0,5), // Camera is at (0,0,5), in World Space
    glm::vec3(0,0,0), // and looks at the origin
    glm::vec3(0,1,0)  // Head is up (set to 0,-1,0 to look upside-down)
);  
glm::mat4 Model      = glm::mat4(1.0f);
glm::mat4 MVP        = Projection * View * Model;

一切正常,我可以更改相机的值,三角形仍然可以正确显示。

但我想使用正交投影。当我将投影矩阵更改为正交时,它的工作无法预测,我无法显示三角形,或者我只能在屏幕的角落看到它的一小部分。要使用正交投影,我这样做:
glm::mat4 Projection = glm::ortho( 0.0f, 800.0f, 600.0f, 0.0f,-5.0f, 5.0f);

虽然我没有更改 View 和模型矩阵中的任何内容。而我就是不能正常工作。

我只需要朝着正确的方向插入,我做错了什么吗?我错过了什么,我应该怎么做才能正确设置正交投影?

PS我不知道是否需要,但这些是三角形的坐标:
static const GLfloat g_triangle[] = {
    -1.0f, 0.0f, 0.0f, 
    1.0f, 0.0f, 0.0f,
    0.0f, 2.0f, 0.0f, 
};

最佳答案

你的三角形大约有 1 个单位大。如果使用宽度为 800/600 单位的正交投影矩阵,则三角形看起来非常小是很自然的。只需减小正交矩阵的边界并确保三角形在该区域内(例如,第一个顶点在 View 之外,因为它的 x 坐标小于 0)。

此外,请确保您的三角形不会被背面剔除或 z 剪裁删除。顺便说一句.. zNear 的负值有点不寻常,但应该适用于正交投影。

关于opengl - 从透视变换到正交矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9573778/

相关文章:

java - 随机 2D 城市景观生成器,如何随机生成?

java - A* 寻路算法运行速度极慢

glsl - 如何使用 Open GL ES 2.0 或 WebGL 创建雾?

OpenGL 着色语言不同类型的变量(限定符)

c - 如何在openGL立方体堆栈中的对象顶部打一个洞?

c++ - opengl c++ 中的 180 到 -180 运动?

c++ - 英伟达 NSight "process creation failure"

opengl - 渲染到立方体贴图

java - 在某个确切点停止的更好方法?

opengl - 片段着色器仅针对可见片段运行吗?