Unity中Shader的面剔除Cull

文章目录


前言

Unity中Shader的面剔除 Cull Off | Back | Front


一、Unity中Shader的面是否剔除,是由我们自己决定的

使用 Cull Off | Back | Front

Cull Off : 关闭剔除,正反面都渲染

Cull Back:剔除背面

Cull Front:剔除正面

默认的Cull是:Cull Back,剔除背面

Cull语句可以写在 SubShader 或 Pass 语句块中

这是Cull Back的效果

这是Cull Off的效果

二、暴露一个属性来控制 剔除模式

//暴露属性来控制 剔除哪里

Enum(UnityEngine.Rendering.CullMode)

_Cull("Cull",int) = 1

测试代码

复制代码
Shader "MyShader/P0_9_4"
{
    Properties
    
    {
        //暴露两个属性,分别对应 源混合类型 和 目标混合类型

        //源混合类型
        [Enum(UnityEngine.Rendering.BlendMode)]
        _SrcBlend("Src Blend",int) = 0
        //目标混合类型
        [Enum(UnityEngine.Rendering.BlendMode)]
        _DstBlend("DstBlend",int) = 0

        //暴露属性来控制 剔除哪里
        [Enum(UnityEngine.Rendering.CullMode)]
        _Cull("Cull",int) = 1


        _MainTex ("Texture", 2D) = "white" {}
    }
    SubShader
    {
        Tags{"Queue" = "Transparent"}

        //混合
        Blend [_SrcBlend][_DstBlend]
        
        Cull [_Cull]

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"
            
            sampler2D _MainTex;
            float4 _MainTex_ST;
            int _SrcBlend;
            int _DstBlend;
            
            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
            };

            struct v2f
            {
                float2 uv : TEXCOORD0;
                UNITY_FOG_COORDS(1)
                float4 vertex : SV_POSITION;
            };

           

            v2f vert (appdata v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = TRANSFORM_TEX(v.uv, _MainTex);

                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {
                
                fixed4 col = tex2D(_MainTex, i.uv);
                
                return col;
            }
            ENDCG
        }
    }
}

三、如何区分正反面

点到面的环绕方式决定了法线方向

法线所指的方向,就是面的正方向

右手逆时针为正

右手顺时针为负

相关推荐
浅陌sss2 小时前
Unity中 粒子系统使用整理(一)
unity·游戏引擎
维度攻城狮6 小时前
实现在Unity3D中仿真汽车,而且还能使用ros2控制
python·unity·docker·汽车·ros2·rviz2
为你写首诗ge9 小时前
【Unity网络编程知识】FTP学习
网络·unity
神码编程11 小时前
【Unity】 HTFramework框架(六十四)SaveDataRuntime运行时保存组件参数、预制体
unity·编辑器·游戏引擎
菲fay13 小时前
Unity 单例模式写法
unity·单例模式
火一线14 小时前
【Framework-Client系列】UIGenerate介绍
游戏·unity
ZKY_2415 小时前
【工具】Json在线解析工具
unity·json
在下胡三汉17 小时前
3dmax批量转glb/gltf/fbx/osgb/stl/3ds/dae/obj/skp格式导出转换插件,无需一个个打开max,材质贴图在
3d·材质·贴图
ZKY_241 天前
【Unity】处理文字显示不全的问题
unity·游戏引擎
快乐非自愿2 天前
Netty源码—10.Netty工具之时间轮
java·unity·.net