Unity模型正反面

        有个很常见的概念——正反面。我们经常使用这个概念,比如Unity的cull命令:

Unity - Manual: ShaderLab command: Cullhttps://docs.unity3d.com/Manual/SL-Cull.html        Unity中的正反面是由顶点顺序(winding order)决定的,Mesh的每个顶点都有一个索引,三角形包含三个顶点的索引。按照索引从大到小遍历,会产生两种情况:如果Mesh的顶点顺序是顺时针,就认为是正面;如果Mesh的顶点顺序是逆时针,就认为是反面。

         如上图,左侧三角面顶点分别是012,遍历顺序逆时针为反面。右侧三角面顶点分别是021,遍历顺序顺时针为正面。

单个面片

        Unity默认的剔除方式为Cull Back,也就是剔除背面,所以你会发现在默认情况下创建的Quad,必然有一面是可见一面不可见,就是背面被剔除。

       有时我们想要做双面渲染,比如渲染树叶这种单个面片,此时必须把Cull Mode设置为Cull Off。另外有一个值得关注的Shader参数是VFace,标识当前渲染的是模型的正面还是反面。

Unity - Manual: Shader semanticshttps://docs.unity3d.com/Manual/SL-ShaderSemantics.html

VFACE

A fragment shader can receive a variable that indicates whether the rendered surface is facing the camera, or facing away from the camera. This is useful when rendering geometry that should be visible from both sides – often used on leaves and similar thin objects. The VFACE semantic input variable will contain a positive value for front-facing triangles, and a negative value for back-facing ones.

        需要注意的是,在单个面片的情况下,模型的正反面是由模型本身决定的,与视角无关。

封闭模型

        实际上更多遇到的是非单个面片的情况,此时模型是封闭的。比如一个立方体,此时在立方体外侧看无论哪个面片都是正面,因为面片的背面在立方体里面隐藏了。但是要特别注意,此时我们说的背面不是单个面片的背面,而是不可见的外侧面(外侧和内侧是相对模型中心而言的,下同)。

         比如上面的立方体,我们能见到的只有三个外侧面,另外背部的三个外侧面就是我们说的背面。为什么要这么定义呢?因为在封闭模型的前提下,单个面片的背面永远不可见,讨论单个面片的背面是没有意义的。所以此时我们说的背面剔除就是指剔除背部的三个外侧面。

        此时的VFACE的取值也变了,可见的三个外侧面值大于0,背部的三个外侧面值小于0。此时VFACE是和视角有关的,当我们旋转视角时,每个面的正反也会发生变化。如果我们使用Cull Off或者Cull Back,那么能看到的只有正面;如果我们使用Cull Front,能看到的只有背面(实际上是背面的内侧面)。

Depth Peeling

        最后提一下深度剥离,深度剥离是一个N pass的渲染过程,每次渲染透明物体的“前面”。

        每个Pass都开启ZWrite,每次将当前面的深度写入到深度缓存,用于下一次的深度测试。

        最关键的是,整个过程都保持Cull Off,不进行任何背面/正面裁剪,这是因为此时背面/正面不再是由模型顶点顺序或者视角决定的,而是深度决定的“前面”和“后面”。举个例子,在上面的示例图中,从左到右只有第一幅图是Cull Back,后面的Passes是既不是Cull Back也不是Cull Front,而是在开启ZTest的前提下,根据当前片元的深度使用Clip函数做手动裁剪。

参考资料:

Creating a Mesh

次序无关的半透明渲染实现 - 知乎 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Unity模型拆分是指将一个完整的模型拆分成多个部分,以便于在游戏中进行分别操作或独立控制。在Unity中,模型拆分可以通过分离和重新组合顶点、面片、材质、动画等不同的方式来实现。 首先,最常见的模型拆分方式是拆分为多个独立的物体。这可以通过Unity的编辑器工具或编程接口来实现。例如,我们可以选中一个模型,分离出其中的一部分,并将其作为一个新的游戏对象,使其拥有独立的位置、旋转和缩放属性。这样可以方便地对不同的部分进行独立操作和控制。 其次,Unity还支持通过材质的拆分来实现模型的分离。在一个复杂模型中,我们可以使用不同的材质给不同的部分上色,然后在游戏中根据不同的材质来控制物体的不同表现。这样可以实现模型的可视化差异,使游戏更加富有层次感。 另外,模型拆分还可以通过动画的分解来实现。在Unity中,我们可以根据模型的骨骼结构,将其进行切割,使得每个骨骼节点上都指定了相应的动画效果。这样在游戏过程中可以独立控制每个骨骼的动画,实现更为细致和复杂的动作效果。 总而言之,Unity模型拆分是将一个复杂的模型切割成多个独立的部分,使其可以单独操作或控制。不仅可以用于位置、材质和动画的分离,还可以提高游戏的性能和可扩展性,为游戏开发带来更多的灵活性和效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值