使用基于GPU的Geometry Clipmap渲染地形(Terrain Rendering Using GPU-Based Geometry Clipmaps)(下)
翻译:clayman
clayman_joe@yahoo.com.cn
仅供个人学习使用,勿用于任何商业用途,转载请注明作者^_^
1.3.5 Vertex Shader
我们使用同一个vertex shader来渲染之前描述的所有2D footprint。首先,对于给定的footprint坐标(x,y)来说,shader通过简单的缩放和变换来计算它的世界坐标(x,y)。接下来,从顶点纹理中读取高度值z。这里不需要任何过滤器,因为顶点和纹理采样是一一对应的。
为了平滑的过渡,vertex shader将对两个不同层次边界的顶点进行几何混合(blend)。根据顶点(x,y)相对于观察点(Vx,Vy)的位置来计算混合参数alpha。这里:
alpha = max( alphax,alphay):
alphax = clamp(( | x – Vx ) – ( (n-1)/2 – w – 1)) /w , 0, 1)
使用类似的方法计算alphay。
这里,所有的坐标都以clipmap网格范围内[ 0….n-1]之间的值来表示,w是交换区域的宽度(这里选择了 w= n/10)。我们希望除了交换区域外,alpha值都为0,而在交换区域内,值线形的从0增加到1,当达到外围的层次时值为1。下图的蓝色部分即为交换区域。
对于几何混合来说,我们对同一位置(x,y)在不同层次之间的高度值Zf(较好层次的高度值)和Zc(教粗糙层次的高度值)之间进行线形插值。
Z’ = ( 1 – alpha)Zf + alpha * Zc
一般情况下,采样点位于较粗糙网格的边缘,Zc则通过对较粗糙层次边缘两个采样点的均值来计算。我们可以在运行时来完成这一步计算,但这将会导致3次顶点纹理查找(Zf一次,Zc = (Zc1 + Zc2)/2 两次),而对于现在的显卡来说,读取顶点纹理的代价还是很大的。
因此,我们把计算Zc作为更新clipmap的一部分来实现,把Zf和Zc打包为同一个单通道的浮点纹理(pack both Zf and Zc into the same 1-channel floation-point texture)。我们把Zf作为浮点数的整数部分,而差值Zd = Zc – Zf则保存为小数部分。这个打包的步骤将在pixar shader中upsampling的时候完成(详见 1.4.1 )。
以下是实现clipmap渲染的vertex shader的部分