我有一个重大问题一直困扰着我一段时间。
我的问题是我的游戏使用了延迟渲染引擎,这使得进行 alpha 混合变得非常困难。
我能想到的解决这个问题的唯一方法是渲染场景(包括深度贴图、法线贴图和漫反射贴图)而没有任何具有 alpha 的对象。
然后对于每个具有带有 alpha 分量的纹理的多边形,禁用 z 缓冲区并将其渲染出来,包括法线、深度和颜色,并且只要 alpha 为“0”,就不会向深度、法线和颜色缓冲区输出任何内容。对这两个单独的纹理执行光照计算/其他延迟效果,然后使用深度图组合颜色缓冲区以检查哪个像素可见。
这个想法的成本非常高(更不用说有一些严重的缺点),这样做显然应该只为尽可能少的情况保留,这使得渲染森林区域成为不可能。但是,如果没有更好的解决方案,我有一个问题。
使用 directx 进行 alpha 混合时,是否可以设置着色器/设备状态,以便在需要时避免写入深度/法线/颜色缓冲区?问题是像素着色器必须输出到它指定的所有渲染目标,所以如果它设置为输出到 3 个渲染目标,它必须这样做,这将覆盖纹理中该纹素的先前颜色值。
如果没有允许我这样做的混合状态,这意味着我必须复制法线、纹理和深度贴图以保留场景,然后渲染到新的纹理、深度和法线贴图,然后根据阿尔法和深度值。
我想我真的只想知道是否有一种简单可靠且可能便宜的方法来在延迟渲染器中渲染 alpha?