Shader笔记——2.Shader基础

UnityShader的基本结构

Shader语义块

    //Shader的名字
    Shader "Custom/YourShaderName"{

    }

Properties语义块

    Shader "Custom/YourShaderName"{
        Properties{
            //暴露给Shader监视面板的属性
            _Color("Color Tint",Color) = (1.0,1.0,1.0,1.0)
        }
    }

SubShader语义块

    Shader "Custom/YourShaderName"{
        Properties{
            _Color("Color Tint",Color) = (1.0,1.0,1.0,1.0)
        }
        SubShader{
            //子着色器SubShader中定义了一系列的标签设置[Tags]、渲染状态设置[RenderSetup]、Pass通道

            Pass{
                //Pass通道中也可以定义[Tags]、[RenderSetup]
                //区别是在SubShader进行的设置会作用于所有的Pass

            }
        }
    }

一、SubShader的标签设置

SubShader的标签[Tags]本质上是一个键值对(Key/Value Pair),它的键和值都是字符串类型,即每一个标签都有一个key对应一个value,key与key之间空格隔开。
例如:

Tags{"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"}

1.1 ”Queue”渲染队列标签——“Queue”控制渲染顺序,指定该物体属于哪一个渲染队列,Shader在渲染前决定物体属于哪个渲染顺序,从而确保所有透明或半透明物体的绘制顺都排在不透明物体的后面

其包括的值有:
(1)”Background”:1000。这种类型的顺序会排在所有物体的前面。例如天空盒。
(2)”Geometry”:2000。所有不透明物体及大多数物体使用这个类型。
(3)”AlphaTest”:2450。使用Alpha Test的物体使用这个类型的渲染顺序。它被排在不透明物体的渲染后面。
(4)”Transparent”:3000。排在Geometry和AlphaTest后渲染。所有alpha混合的物体都应该选择这个类型。
(5)”Overlay”:4000。这一类是最后渲染的,比前面所有类型都要置后,例如镜头光晕。
(6)用户自定义值:比如”Queue”=”Geometry+10”。

1.2 “RenderType”渲染类型标签——主要用于识别与替换,从而使Unity可以在运行时给特定Camera替换特定的RenderType下的所有Shader。与Camera.RenderWithShader或者Camera.SetReplacementShader函数配合使用。

(1)”Opaque”:大部分不透明的物体都使用这个。
(2)”Transparent”:大部分透明的物体、包括粒子特效都使用这个;
(3)”Background”:天空盒都使用这个;
(4)”Overlay”:GUI、镜头光晕都使用这个;
(5)用户自定义RenderType字符串。

1.3 "DisableBatching"标签——设置该物体上的Draw Call Batching,表明是否使用批处理。

其包括的值有:
(1)True,设置当前物体Draw Call Batching关闭
(2)False,默认值为False ,设置当前物体Draw Call Batching打开
(3)LODFading,只有LOD Fading设置被开启时关闭该物体上的Draw Call Batching。

1.4 ”ForceNoShadowCasting”标签——设置该Subshader的物体是否会投射阴影,默认为False的,即默认状态下物体会去绘制阴影部分的渲染。

1.5 ”IgnoreProjector”标签——设置该SubShader的物体是否受Projector的影响,默认状态下是False,即在默认状态下物体能够响应Projector投射的阴影绘制。

1.6 ”CanUseSpriteAtlas”标签——针对图集里的元素的,UGUI中经常使用。当CanUseSpriteAtlas为False时,将不会对打进图集里的贴图进行绘制。默认为True。

1.7 “PreviewType”标签——设置编辑器Material材质球展示材质预览效果时的形状,默认球形,通过这个标签,可以设置为Plane面板形状或者Skybox天空盒形状。

以上标签可以在SubShader子着色器下以及Pass下定义

二、SubShader的渲染状态设置

ShaderLab提供了一系列渲染状态的设置,这些指令可以设置显卡的各种状态,例如是否开启混合/深度测试等。

2.1 Cull    Cull Back|Front|Off

设置剔除模式,剔除背面|正面|关闭剔除 默认CullBack

2.2 ZTest    ZTest Less Greater|LEqual|GEqual|Equal|NotEqual|Always
设置深度测试,默认ZTest LEqual即小于或等于目标深度才能被渲染

2.3 ZWrite    ZWrite On|Off

设置深度写入,默认ZWrite On

2.4 Blend    Blend SrcFactor DstFactor
开启并设置混合模式

2.5 Offset Factor Units
设置深度缓存的偏移量,Factor偏移缩放大小和Units偏移量。Factor相当于缓存数据偏移放大的倍数,Units相当于直接偏移的量。

SubShader的渲染状态也可以在Pass中定义

三、Pass语义块

Pass通道是最为重要的一部分,因为我们大部分的代码都是写在Pass语义块中的。

Pass通道的标签设置

3.1 “LightMode”标签——指定Pass和Unity的哪一种渲染路径(“Rendering Path”)搭配使用。
(1)ForwardBase
(2)ForwardAdd
(3)Always,永远都渲染,但不处理光照。
(4)ShadowCaster,用于渲染产生阴影的物体。
(5)ShadowCollector,用于收集物体阴影到屏幕坐标Buff里。

CG代码块

    Shader "Custom/YourShaderName"{
        Properties{
            _Color("Color Tint",Color) = (1.0,1.0,1.0,1.0)
        }

        SubShader{
            
            Pass{

                CGPROGRAM
                //CG代码块

                ENDCG
            }
        }
    }

编译指令

//指定顶点、片元函数
#pragma vertex vert
#pragma fragment frag

定义结构体a2v、v2f

struct a2v{
    float4 vertex : POSITION;
    float3 normal : NORMAL;
    float4 texcoord : TEXCOORD0;

}

struct v2f{
    float4 pos : SV_POSITION;
    fixed3 color : COLOR0;
}
  • POSITION语义告诉unity将模型空间中顶点的位置信息填充至特定参数
  • NORMAL语义告诉unity将模型空间中顶点的法线方向填充至特定变量
  • TEXCOORD0语义告诉unity将模型的第一套纹理坐标填充至特定变量
  • COLOR0语义告诉unity,该变量储存了一个颜色信息
  • SV_POSITION语义告诉unity,该变量中包含了顶点在剪裁空间的位置信息
  • SV_Target语义告诉渲染器将用户的输出颜色存储到一个渲染目标(Render Target)中,默认存储带帧缓存中

PS:在unity中POSITION、NORMAL、TANGENT这些数据都是由Unity的MeshRender组件提供的,在每帧调用Draw Call时,MeshRender组件会把它所负责渲染的模型数据发送给shader

定义顶点着色器

定义片元着色器

Fallback语义块

REF

书籍:

OpenGL超级宝典、UnityShader入门

博客:

https://blog.csdn.net/hcud024/article/details/51360099

http://www.luzexi.com/2018/08/08/Unity3D%E9%AB%98%E7%BA%A7%E7%BC%96%E7%A8%8B%E4%B9%8B%E8%BF%9B%E9%98%B6%E4%B8%BB%E7%A8%8B-Shader4.html

转载于:https://www.cnblogs.com/sylvan/p/9501881.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值