了解glm :: ortho()的参数如何影响投影后的顶点位置

时间:2017-02-21 07:11:00

标签: c++ opengl rendering glm-math orthographic

在搜索了很多页面,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);

(请注意,因为我使用变量名称mvp并不意味着它们实际上是该名称的正确转换,以上就是我想做的事情)

我对以下内容感到困惑:

  • 正字界限在哪里?我假设它指向负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);
  • 现在我假设第三个问题将通过以上两个回答,但是我想弄清楚这是不是为什么我的第一段代码要求我翻转x轴上的所有内容才能工作......我承认我只是搞乱它,它碰巧工作了。我想我需要一个180度的旋转来转动我的飞机,所以它在-z侧然而......所以这让我只能算出-1.0,1.0,1.0缩放。

这个例子中提供的代码(减去变量名称)是我使用的唯一东西,渲染效果很好...它只是因为我不知道为什么它的工作原理我不知道不满意。

编辑:试图通过使用网站上的图片和说明作为参考的唯一示例,从here了解它。我可能错过了这一点。

EDIT2:作为一个随机问题,由于我总是在z = 1.0处绘制我的平面,我是否应该将我的正投影近/远平面限制为尽可能接近1.0(例如:0.99,1.01)?假设没有绘制或将绘制任何其他内容。

0 个答案:

没有答案