在搜索很多页面之后,glm文档,教程等等,我仍然对某些事情感到困惑。了解glm :: ortho()的参数如何影响投影后的顶点位置
我想了解为什么我需要应用以下转换以获取我的800x600(全屏方形,假设用户的屏幕为800x600,用于此最小示例)图像以绘制所有内容。假设我只绘制CCW三角形。一切呈现在我的代码很好,但我必须做到以下几点:
// Vertex data (x/y/z), using EBOs
0.0f, 600.0f, 1.0f,
800.0f, 0.0f, 1.0f,
0.0f, 0.0f, 1.0f,
800.0f, 600.0f, 1.0f
// Later on...
glm::mat4 m, v, p;
m = scale(m, glm::vec3(-1.0, 1.0, 1.0));
v = rotate(v, glm::radians(180.0f), glm::vec3(0.0f, 1.0f, 0.0f));
p = glm::ortho(0.0f, 800.0f, 600.0f, 0.0f, 0.5f, 1.5f);
(注意,只是因为我使用的变量名m
,v
,并且p
并不意味着他们实际上是为适当变换这个名字,以上只是我想要做什么它)
我很困惑在以下方面:
哪里正投影界限?我认为它是指向负Z轴,但左/右边界在哪里进来?这是否意味着x轴上的[-400,400]映射到[-1.0,1.0] NDC,或者[0,800]映射到它? (我假设这里的任何答案适用于y轴)。然后文件只是说
Creates a matrix for an orthographic parallel viewing volume.
如果你翻转下面的第三和第四个参数会发生什么(我问,因为我看到人们这样做,我不知道这是一个错误/错字还是它通过侥幸工程..或者如果它正常工作,无论):
参数数量三,四的位置:
_____________
| These two |
p1 = glm::ortho(0.0f, 800.0f, 600.0f, 0.0f, 0.5f, 1.5f);
p2 = glm::ortho(0.0f, 800.0f, 0.0f, 600.0f, 0.5f, 1.5f);
- 现在,我认为这第三个问题将与上述两种回答,但我tryi要弄清楚这是为什么我的第一部分代码要求我翻转x轴上的所有东西来工作......我承认我只是搞乱了它,而且碰巧发生了。我想我需要一个180度的旋转来转动我的飞机,所以它的-Z侧,然而...所以这只是让我想出了-1.0,1.0,1.0的缩放。
本示例中提供的代码(减去变量名称)是我使用的唯一东西,并且渲染完美无缺......这仅仅是我缺乏关于它为什么会起作用的知识,我不满意。
编辑:试图从here通过使用网站上的图像和描述作为一个参考的例子来了解它。我可能错过了这一点。编辑2:作为一个随机问题,因为我总是在z = 1.0处绘制我的平面,所以我应该限制我的正投影近/远平面尽可能接近1.0(例如:0.99,1.01) ?假设没有其他东西被绘制或将被绘制。