在搜索了很多页面,glm文档,教程等之后,我仍然对某些事情感到困惑。
我试图理解为什么我需要应用以下转换来获取我的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);
这个例子中提供的代码(减去变量名称)是我使用的唯一东西,渲染效果很好...它只是因为我不知道为什么它的工作原理我不知道不满意。
编辑:试图通过使用网站上的图片和说明作为参考的唯一示例,从here了解它。我可能错过了这一点。
EDIT2:作为一个随机问题,由于我总是在z = 1.0处绘制我的平面,我是否应该将我的正投影近/远平面限制为尽可能接近1.0(例如:0.99,1.01)?假设没有绘制或将绘制任何其他内容。