|
|
要表现水的深浅效果,必须在投影后,知道水底河床的深度 Dt, 从而,用当前渲染的水的网格的深度 Dw - Dt 得到水到河床的距离,从而表现水的透明度随深浅变化的效果
能不能不用多一个 pass 来将地形(河床)的深度渲染到一张 32F 的贴图上,比如直接拷贝当前已有的深度缓冲到一张贴图?或者其他方法?
在现在这个项目中,用的是DX,后备缓冲格式是 R8G8B8X8,深度缓冲是 Z24S8。
请各位高手支招啊,谢谢
另外,先前最开始尝试的方法是:
在垂直水面方向,遍历水面网格的顶点,记为 Pw,用其 z 值减去其竖直向下对应的地形网格顶点的 z 值,如: depth = Pw.z - Pt.z;
然后将 depth 存到水网格的 w 分量中, Pw.w = depth,通过这种方式传到 shader 中,然后
在顶点 Shader 中:
OUT.depth = Pw.w;
Pw.w = 1.0; // w 位只是借用存一下高度
在像素 Shader 中:
OUT.col.a = clamp( 0.0f, 1.0f, IN.depth );
这样就可以表现岸边到水深为1米的这段区域里,alpha 值从0开始往1递增,但是,这个深度是和摄像机朝向相关的,只有摄像机垂直向下才是正确的,当摄像机斜着看过去深度值就是错位的(此时,正确的深度应该是摄像机在水面和地形之间逐顶点或逐像素做射线碰撞,得到的距离,但这样性能消耗应该比多一个PASS还大)。
还有,论坛上有朋友说,将上面提到的垂直深度值预渲染到一张 alpha 纹理上,然后传进 shader。可能是我没理解到,这有两种理解方式:
1. 该 alpha 图用在渲染水网格的时候(那么,会遇到跟上面一样的摄像机朝向相关的问题,不知如何解决?)
2. 该 alpha 图用在渲染地形的时候(也就是将其渲染在地形上,这里至少就存在两个问题:首先是地形上不仅存在水一种类型的物体,改变了其alpha值在渲染其他物体时会不会出错?另外一个问题是水的深度在逻辑上是由水决定的,其深度的处理应该由水的渲染逻辑来处理,而不是地形)
整理一下思路,现在本人知道的方法有两种:
1. 在渲染水时,在像素 shader 中与当前深度缓冲中的深度值做减法,得到的 deltaDepth * ( farPlane - nearPlane ) 就是深度。但问题是,在DX中不知如何廉价的得到深度缓冲的值
2.在地图加载时,垂直的将水深逐顶点保存在水网格中/或者渲染到一张贴图中,然后在 shader 中转换成透明值进行处理。(问题是,该深度是和摄像机朝向密切相关的,只有垂直朝向才是正确的,其他朝向,深度都是错位的)
可能是已经走入了死胡同,实在是找不到解决方法了,请各位给点思路,不吝赐教,谢谢。 [em1] |
|