Part I 空气曲棍球 Chapter6(6.2 Transforming a Coordinate from the Shader to the Screen)

6.2 顶点转换(Transforming a Coordinate from the Shader to the Screen)

    我们现在已经熟悉了规范化设备坐标,我们也知道显示在屏幕上的顶点的x、y、z坐标必须位于[-1, 1]之间,现在我们来复习下着色器设置的坐标gl_Position如何转换为最终显示到屏幕上的坐标。如下图所示:


    这里有两个转换步骤及三个坐标空间。

6.2.1 裁剪空间(Clip Space)

    当顶点着色器把一个坐标值写入gl_Position后,OpenGL期望这个坐标位于裁剪空间中,裁剪空间背后的逻辑相当简单:对于任何坐标,x、y、z分量必须位于-w到w之间;比如:假如一个顶点的w分量是1,那么相应的x、y、z也必须位于-1到1之间;所有位于这个区间外的顶点都不会得到显示。
    一旦我们学习了透视分割后我们就会理解为什么它依赖于顶点的w分量。

6.2.2 透视分割(Perspective Division)

    在一个顶点变成规范化设备坐标空间之前,OpenGL会执行一个叫做透视分割的操作。经过透视分割操作后,顶点就位于规范化设备坐标空间中了,此时无论渲染区域的形状或大小怎样每一个可见顶点的x、y、z分量都位于区间[-1, 1]之间。

    为了在2D的屏幕上创建一个3D的场景,OpenGL首先会取顶点gl_Position的x、y、z分量分别除以w分量。当w分量用于代表距离的时候,这将会使得越远的物体离渲染中心(就像一个消失的点-----汇集点)坐标越近,OpenGL就是使用这种技巧进行视觉欺骗让我们感觉它是一个3D场景,而艺术家在几个世纪中也是使用了种技巧进行3D作品的创作。
    举个例子,假如有一个物体有两个顶点,两个顶点在3D坐标中有同样的坐标值,即相同的x、y、z,但是不同的w分量。比如这样的两个坐标[1, 1, 1, 1]和[1, ,1 ,1, 2]。在OpenGL将他们当成规范化设备坐标之前,它将会执行透视分割操作,也就是将前面三个分量分别除以w分量,即:(1/1, 1/1, 1/1) 和(1/2, 1/2, 1/2)。透视分割后,得到的规范化设备坐标即为(1, 1, 1)和(0.5, 0.5, 0.5)。w分量较大的坐标离规范化设备坐标中心渲染区域(0, 0, 0)较近。
    如下图所示,3D坐标相同,但是具有不同的w分量,w分量越大则离坐标中心越近。


    在OpenGL中,3D效果是线性的,在实际中,事情会变得非常复杂(比如鱼眼长),但是这种线性效果是一种合理的模拟。

6.2.3 齐次坐标(Homogenous Coordinates)

    由于透视分割的原因,在裁剪坐标空间中的坐标通常称为齐次坐标(1827年由August Ferdinand Möbius引入),被称为齐次坐标的原因是位于裁剪空间中的多个坐标有可能映射到同一个坐标顶点;比如下面的坐标顶点:
(1, 1, 1, 1), (2, 2, 2, 2), (3, 3, 3, 3), (4, 4, 4, 4), (5, 5, 5, 5)
    当经过透视分割后,所有这些顶点都会映射到规范化设备坐标空间的顶点(1, 1, 1)。

6.2. 4 透视分割的优点(The Advantages of Dividing by W)

    你可能很奇怪为什么我们不除以z,毕竟假如我们把z当成距离,并且有两个顶点(1, 1, 1)和(1, 1, 2),这样我们可以分量除以z分量得到两个规范化设备坐标(1, 1)和(0.5, 0.5)。
    虽然这样也行得通,但是把w当成第四个分量还有其它的优点。我们可以把透视分割从z坐标中解耦出来,这样的话我们就可以在正交投影与透视投影之间切换,这里还有一个优点就是可以保留z作为深度缓存。

6.2.5 视口变换(Viewport Transformation)

    在我们看到最终的绘制效果之前,OpenGL需要映射规范化设备坐标系中的顶点到操作系统预留的屏幕显示区域上,这个区域叫做视口,这些映射的坐标称为窗口坐标。对于这些坐标空间我们并不需要太担心,我们只需要告诉OpenGL如何做映射即可,在代码中是通过在onSurfaceChanged()中调用glViewport来指定视口大小的。
    当OpenGL做这个映射动作时,它将会把预留的显示区域映射为(-1, -1, -1)到(1, 1, 1)。在这个区域外规范化设备坐标将会被忽略。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值