我有一个主要问题,一直困扰我一段时间。
我的问题是我的游戏使用延迟渲染引擎,这使得很难进行alpha混合。
我能想到解决这个问题的唯一方法是渲染场景(包括深度图,法线贴图和漫反射贴图),而不使用任何具有alpha值的对象。
然后对于具有带alpha分量的纹理的每个多边形,禁用z缓冲区并将其渲染出来,包括法线,深度和颜色,以及alpha为'0'的任何地方都不会输出任何深度,正常和颜色的内容缓冲。对这两个单独的纹理执行光照计算/其他延迟效果,然后使用深度图组合颜色缓冲区以检查哪个像素可见。
这个想法是非常昂贵的(更不用说有一些严重的缺点)这样做显然应该只保留尽可能少的情况,这使得森林区域不可能。但是,如果没有更好的解决方案,我有一个问题。
当使用directx进行alpha混合时,我可以设置着色器/设备状态,以便我可以避免在需要时写入深度/普通/颜色缓冲区吗?问题是像素着色器必须输出到指定的所有渲染目标,因此如果将其设置为输出到3个渲染目标,则必须执行此操作,这将覆盖纹理中该纹理元素的先前颜色值。
如果没有允许我这样做的混合状态,那就意味着我必须复制法线,纹理和深度贴图以保持场景,然后渲染到新的纹理,深度和法线贴图然后将两者结合起来基于alpha和深度值的纹理。
我想我真的想知道的是,如果在延迟渲染器中渲染alphas有简单的确定性和可能的廉价方法吗?
答案 0 :(得分:1)
在延迟渲染器中绘制透明几何体的常用方法是在单独的传递中绘制它们,但使用通常的前向渲染,而不是延迟渲染。