半透明物体渲染总结 您所在的位置:网站首页 maya物体半透明 半透明物体渲染总结

半透明物体渲染总结

2023-09-12 06:50| 来源: 网络整理| 查看: 265

文章目录 半透明渲染要解决的问题深度测试解决可见性问题的原理渲染顺序半透明物体不能开启深度写入 整体透明(内部不透明)的渲染双面透明渲染混合公式Alpha Test

半透明渲染要解决的问题

需要将半透明物体按照正确的顺序进行渲染,以便让它们的片元和远处已经绘制到color buffer中的片元颜色进行混合,从而达到半透明的效果。为了完成颜色的正确混合,所有半透明物体应该在不透明物体渲染完成之后进行渲染,且半透明物体之间应该是按照距离camera从远到近渲染。但是物体是若干三角形图元的集合,包含了很多的片元,无法针对片元进行排序。对于不透明物体可以通过深度测试解决,但是半透明物体确不能简单处理。

深度测试解决可见性问题的原理

对于不透明物体,我们借助深度测试来解决像素的可见性问题。深度测试的时候我们比较当前片元的深度值和z buffer中的深度值,如果当前片元的深度值更小(离camera更近),则可以绘制当前片元,并且将z buffer中的深度值更新为当前片元的深度值。即使用深度测试解决可见性问题时,我们需要开启深度写入和深度测试,这两个功能是互相配合的。

渲染顺序 首先渲染所有的不透明物体(正常是按材质分组渲染有利于动态batch以及减少状态切换,并在组内按由近到远排序以便减少overdraw)。开启深度写入和深度测试。渲染半透明物体,按由远到近排序,先渲染远处的物体,再渲染近处的。开启深度测试,关闭深度写入。开启混合,设置混合公式和参数。 半透明物体不能开启深度写入

在上面的渲染过程中,对于半透明物体,需要关闭深度写入,是有原因的。因为当半透明物体的片元渲染并且将深度值写入z buffer,就会导致它后面同一屏幕坐标,但深度值更大的片元通过不了深度测试而渲染不了。而这个片元可能本身是应该要渲染的。很多文章就说到这儿了,我们再深入分析一下,这个本该被渲染的片元来自哪儿。首先,按照上面描述的渲染顺序,不透明物体已经先于所有半透明物体渲染过了,所以不存在被半透明物体的深度写入影响的情况。那么对于半透明物体,有两种情况。一是两个半透明物体存在交叉的情况,这样无论怎么排序,这两个物体之间总有一些片元没有按照离camera从远到近的顺序渲染,此时如果近处的片元先渲染且写入深度,就会影响后面的片元。另外一种情况是,重叠的片元来自于同一个半透明物体。因为一个物体的图元是在一次draw call中一起提交给GPU进行渲染,GPU会并行处理若干图元,对于片元也是一样并行处理。这样对于同一个物体中的片元,不能确定哪个先画,哪个后画。

整体透明(内部不透明)的渲染

如果一个复杂的物体需要半透明显示出来,但是按照常规的方法,所有的三角形和片元都会被渲染,这样会产生很难看的重叠效果。此时我们可能要求只渲染能被camera看到的片元,但是整体还是需要和背景进行透明混合。可采用以下方法,分两个pass进行。

Pass 1 关闭颜色写入,开启深度测试和深度写入,使用一个简单的shader,将顶点变换到Clip Space就可以。这样pass完成后, z buffer中该物体可见的片元的深度会被写入。Pass 2 开启颜色写入,开启深度测试,关闭深度写入,开启混合。使用正常的shader渲染物体。这样只有可见的片元才会渲染,而物体内部的片元都通过不了深度测试从而被丢弃。由于开启了混合,物体整体是被半透明渲染到背景上的。 双面透明渲染

我们绘制物体时,一般会开启背面剔除,这一物体内部,背对摄像机的面是不会被绘制的。但是当绘制半透明物体时,有时我们可能希望要绘制内部的背对摄像机的面,因为物体是半透明的,这些面是可以被看到的。对于这种需求,我们采用双面渲染的方法,使用两个pass渲染。

Pass 1 开启剔除,剔除正面。渲染该半透明物体。Pass 2 开启剔除,剔除背面。再次渲染该物体。 混合公式

最简单常见的混合就是半透明alpha混合,即 FinalColor = SrcColor * SrcAlpha + DstColor * (1-SrcAlpha) 该操作将当前片元的颜色部分叠加到color buffer该位置已有的颜色上。 混合公式是可配置的。首先是参数可配置,这里SrcAlpha以及1-SrcAlpha两个参数,可以替换成One,Zero,SrcColor,DstColor,DstAlpha,1-SrcColor,1-DstColor,1-DstAlpha等。 另外加法操作也可被替换为Sub, RevSub, Min, Max等。 有一种叫Alpha预乘的技术,常用于渲染2D图片,原理是预先将alpha值乘到图片像素颜色中,这样在上面公式的第一个参数就从SrcAlpha改成One。(第二个参数还是1-SrcAlpha)。该技术的作用可参考这篇文章。 对于混合公式和参数的设置还有常见的粒子特效的叠加,两个参数都使用One,所谓的additive混合。

Alpha Test

Alpha Test即透明度测试,原本和半透明渲染没什么关系,只是它使用到了alpha值。这个不多说,就是在片元shader里面判断一下,alpha值小于某个阈值时丢弃该片元。Alpha Test从效果来说,可以实现镂空效果,但是边缘可能比较粗糙,镂空效果通过半透明也能实现且效果更好,因为边缘可以柔和一些。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有