unity shader格式

主要框架

  • Shader “learn/MyShader”:unity工程里shader的名称, / 表示子层级。
  • Properties{}:属性,材质球面板显示的贴图、属性参数等需要在这里定义设置,也可以不要。
  • SubShaders{}:游戏中通常做3个SubShader对应高中低三种机器配置,在第一个SubShader不能满足时会换第二个,以此类推。
  • FallBack “Diffuse”:如果SubShaders里的3个都不满足或者写的shader在一些机器上不支持时,会自动切换成引号内名称的shader。

Properties格式

  • 通用格式:[Attribute]_Name (“Display Name”,Type) = Default Value
    1. Attribute属性标记,对当前这条属性做一些特殊处理。
    2. _Name名称,即shader中的变量名,也是外部脚本的调用名。
    3. Display Name材料面板上显示的名称,主要起注释作用。
    4. Type属性类型,有Range(滑竿), Color, Int, Float, Vector, 2D, 3D, Cube等类型。
    5. Default Value属性默认值,与类型对应。

Attribute属性标记

  • [Header(text)]:在界面生成一个内容为“text”的文本,通常用作分类组别用,只支持英文、数字、空格以及下划线。
  • [HideInInspector]:不在在材质面板中显示此条属性,隐藏之。
  • [Toggle]:勾选项,只接受数字类型,勾选时为1,否则为0。
  • [IntRange]:把参数限制在整数范围。
  • [PowerSlider(Value)]:指数级的缩放滑动条的疏密程度,靠近Range的左值会拥有更精确的调整范围,Value接受指数等级控制,值为1时相当于普通Range。
  • [Enum(List)]:枚举类型,把参数限制下拉列表的可选项中。
  • [NoScaleOffset]:不显示纹理的缩放/偏移编辑器。
  • [Normal]:提示这是一个法线纹理。

更多标记见官方文档unity3D/Editor/Data/en/ScriptReference/MaterialPropertyDrawer.html

Type属性类型

//定义Numbers(数值)和Sliders(区间值)
name ("display name", Range (min, max)) = number
name ("display name", Float) = number
name ("display name", Int) = number

//定义Colors(颜色)和Vectors(向量)
//颜色表示为一个四维向量,对应颜色的RGBA通道;每个分量取值为[0,1]
//向量必须是四维向量
name ("display name", Color) = (number,number,number,number)
name ("display name", Vector) = (number,number,number,number)

//定义Textures(纹理)
name ("display name", 2D) = "defaulttexture" {
    
    }
name ("display name", Cube) = "defaulttexture" {
    
    }
name ("display name", 3D) = "defaulttexture" {
    
    }
  • 其中defaulttexture为纹理声明时的默认值,有以下默认值:
    在这里插入图片描述
  • 非2维纹理,如:Cube, 3D, 2DArray,默认值是empty string,当他们没有材质指定时,默认使用“gray”

SubShaders格式

SubShader
{
    
    
	//[Tags]标签,[RenderSeup]状态 都是可选的,如果在pass里面用的话那么将会应用于所有的pass
	//[RenderSeup]用来设置显卡的各种状态,例如开启混合|深度测试等等
	//[Tags]是一个键值对,用来表示,subshader和渲染引擎之间的关系,告诉引擎,我该怎样,或者如何渲染对象

	Tags {
    
     "RenderType" = "Opaque" "LightMode" = "ForwardBase" }
	LOD 100
	//顶点,片元着色器的书写都会在pass里面,但是surfaceShader不需要
	//surfaceShader是对片元,顶点着色器更高一层的抽象,价值在于处理光照细节
	Pass
	{
    
    
		CGPROGRAM  //开启CG代码段
		//编译指令
		#pragma vertex vert
		#pragma fragment frag
		//颜色和向量用float4 / half4 / fixed4存储,精度从高到低
        //数值用float / half/ fixed存储,精度从高到低
        //2D纹理 / 3D纹理 / Cubemap分别用sampler2D / 3D / CUBE存储
        sampler2D _Texture;
        float4 _Texture_ST;
        float4 _Texture_TexelSize;
        fixed4 _Color;
        float4 _Vector;
        samplerCUBE _Cubemap;


		//定义了一个结构体
        struct appdata//vert的输入
        {
    
    
            float4 vertex : POSITION;
            float2 uv : TEXCOORD0;
        };
        struct v2f//vert的输出
        {
    
    
            float2 uv : TEXCOORD0;
            float4 vertex : SV_POSITION;
        };


        v2f vert (appdata v)
        {
    
    
            v2f o;
            o.vertex = UnityObjectToClipPos(v.vertex);
            return o;
        }

        fixed4 frag (v2f i) : SV_Target
        {
    
    
            return col;
        }
        ENDCG/ENDCGsampler
	}
}
//如果上面的subshader都不满足条件,就会执行下面的东西
FallBack "Diffuse"
FallBack off//关闭

猜你喜欢

转载自blog.csdn.net/yx314636922/article/details/124146571