纯手码字翻译大佬教程. 因为parallax算法和RayMarching算法相似(都为步进采样),就放在一个专栏里了,自己理解的地方有注明.
原文链接 :https://github.com/UPBGE/upbge/issues/1009
这个教程介绍了怎么用GLSL使用不同的视差贴图技术(也可以在DX中运用)。下面要介绍的技术有:视差贴图,偏移限制视差贴图,陡峭视差贴图,浮雕视差贴图以及视差映射贴图(POM),同样这篇文章介绍了怎么在视差中加自投影。下面的图片描绘了在简单灯光下视差贴图和法线贴图的差别:
基础视差贴图
在计算机图形学中视差贴图是法线贴图的进阶版,也就是不仅仅改变光的行为还在平面中制造了3D细节的假象.并没有额外生成模型.在之前展示的视差和法线的对比图中.您可能会认为视差移动了原来的模型,实际上是移动了UV后采样了diffuse贴图和normal贴图.
使用视差贴图需要一张高度图,高度图储存了每个像素表面的高度信息。可以描述成距离表面的深度,在这种情况里必须反转高度图. 这个教程里把高度图的信息视作深度信息.黑色(0)代表了没有孔,白色(1)代表了孔的最大深度.
在下面的视差贴图范例中我们使用三张贴图:heightMap,diffuseMap还有normalMap,通常normalMap是由heightMap生成的.在我们的范例中高度图作为深度图使用.所以在生成normalMap之前.您必须反转高度图.您可以把normalMap和heightMap合并成一张图(heightMap作为Alpha通道),但是本教程为了方便一点使用了三张不同的贴图.下面是视差的贴图范例:
视差贴图技术的主要任务是通过移动UV修改贴图来让平面看着像3D. 这个效果会在片段着色器中显示的所有像素进行计算. 如下图.Level0代表没有坑洞.Level1代表最深的孔. 模型实际上没有变而且一直在Level0处.曲线代表的是储存在高度图中的值.当下的像素坐落在黄色方形处.这个像素对应的UV(TextureCoordinates)是T0.V是从摄像机到该像素的向量.如果按照T0采样高度图的话能得到值H(T0) = 0.55.值不等于0。所以该像素并不在表面. 在像素之下有坑. 所以你必须延申V到由高度图定义曲面的交点.这个交点正在深度为H,UV位T1的位置,然后用T1去采样diffuseMap和normalMap.
因此所有视差算法的目标都是去计算摄像机向量V和高度图所定义表面的交点。
视差贴图基础shader
视差贴图的计算必须在切线空间里(和法线一样).所以灯光(L)和摄像机(V)的向量必须转换到切线空间.然后用视差技术计算新的UV坐标,然后您可以用这个新的UV坐标计算子投影以及采样这个像素的diffuseMap和normalMap.在这个例子中执行视差算法的函数是parallaxMapping() ,计算自投影的函数是parallaxSoftShadowMultiplier().光照模型用的是Blinn_Phong光照模型.法线方程是normalMappingLighting().下面的顶点和片段着色器可以当作是视差贴图算法的基本架构.顶点着色器变换了L,V到切线空间.片段着色器调用了视差算法函数,然后计算自投影最后计算光照&