河南漫云科技有限公司
主营产品: 元宇宙系统开发、元宇宙源码、NFT数字藏品软件开发,nft智能合约开发,盲盒系统app开发搭建,nft源码系统,网络技术开发,软件技术开发,软件定制,技术开发,信息技术服务
DAPP丨NFT卡牌/盲盒/农场/对战链游系统开发
发布时间:2024-11-24

    1.基于面片实现:

    直接用一个Quat的mesh,加上一张贴图,简单直观的实现.

    缺点:只能在平面上贴.

    2.修改贴图:

    将物体的材质贴图替换成原贴图和decal贴图的混合,适用于静态批量的物体

    缺点:只适用于静态物体

    3.基于SubMesh:

    先获取跟目标投影相交的mesh,然后将mesh根据投影框进行裁剪

    1.获取所有可能和投影框相交的mesh,一般游戏引擎都会有Octree或BVH保存mesh的aabb,这一步简单获取aabb相交的mesh即可.

    2.将mesh的顶点数据变换到投影框的三维空间中,这样一来是方便裁剪,二来是裁剪完成后可以将变换后的坐标值直接作为uv值使用.

    3.得到相交的三角形片:

    判断每个点是否在投影框内,如果三角形有任意一个点在框内,则认为三角形与投影框相交.当然这种方法会漏掉一些三角形,比如这中情况:当然如果mesh较小以及要求不精细的话也没有太大问题.

    4.将所有相交的三角形片,合并成新的IndexBuffer,使用新的decal的纹理重新渲染一次,UV可以直接取映射到框中的xy值,当然要注意在shader中把uv0~1之外的部分clip掉

    5.如果你想的话,也可以对处在边界,不完全在框内部的三角形进行裁剪,后整理顶点生成新的mesh.

    4.基于Multi-Pass实现:

    和上面方法很相似

    1.获取所有相交的mesh;

    2.在mesh正常渲染结束后,再渲染一次,使用decal的shader,向shader中传入一个ClipToDecal的矩阵(=ClipToWorld*WorldToDecal),在FS中计算计算映射到decal框中的坐标,取决于具体的实现,可以将xy坐标作为uv,以及裁剪掉uv0~1之外的部分,将decal渲染出来.

    Unity的built-in管线中的Projector就是使用的这种方式.

    缺点:如果投影框与多个mesh相交,或者mesh很大,则会产生很大的性能消耗.

    5.修改渲染shader实现

    判断decal框和某个mesh相交时,将decal标记为需要渲染.修改mesh的shader,传入一个或多个decal投影框矩阵+数张decal贴图.FS得到原始的输出颜色后,再根据decal拿到的颜色进行混合,如果同时有多个Decal,则需要不同数量改变shader变体.

    缺点:需要大量调整shader,复杂繁琐,而且一个mesh上的decal数量在运行时发生变化时,需要动态编译shader变体.

    6.基于后处理实现:

    将decal整体作为一个长方体进行渲染两次来对目标进行贴花

    1.首先正常渲染其他的物体,拿到正常渲染的buffer和depthbuffer.

    2.将投影框作为一个长方体进行渲染,关闭FaceCull,将depthtest设置为GreatEqual,输出一个标志位到stencilbuffer(或者任意其他可以标志像素点的方式),不需要输出颜色值

    3.再次将投影框作为长方体渲染,打开FaceCull(只绘制长方形靠前的三个面),再上一步中stencilbuffer测试通过的位置绘制,与前面方法不同的是,当前像素点的WorldPosition通过从depthbuffer中读取然后反变换获得(后处理中非常常用的方法).

    7.Deferred实现

    大致和上面的方法相同

    deferred渲染管线中渲染所有gbuffer之后

    和上一个方法中讲到的一样,同样是先渲染长方体,写入stencilbuffer,然后再次渲染长方体,根据stencilbuffer来改变gbuffer中的数据,根据需要选择修改basecolor,normal等;

    因为gbuffer被修改,后面的光照计算会产生decal的效果.

    UE4中的DefferedDecal,就是这种方法(未使用Dbuffer时)

    缺点:只能用于Deferred,不支持烘培光(因为烘培光是在渲染gbuffer时加上的).

    8.Dbuffer

    先进行depthprepass渲染深度图

    用上面提到的方法将decal渲染到类似gbuffer的dbuffer上,然后在渲染gbuffer时(或者forward渲染时),直接应用同样位置对dbuffer进行采样,融合到gbuffer中,可以支持烘培光,支持deferred,forward管线.


展开全文
拨打电话 微信咨询 发送询价