Shader3-Unity中的基本着色器

本文深入解析Unity中的Shader种类,包括StandardSurfaceShader、UnlitShader、ImageEffectShader等,并详细阐述了顶点/片元着色器、表面着色器及固定函数着色器的使用方法与特性,帮助读者掌握Unity Shader的编写技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Unity中的Shader模板

  1. Standard Surface Shader 包含了标准光照模型的表面着色器
  2. Unlit Shader 不包含光照(包含雾效)的基本顶点/片元着色器
  3. Image Effect Shader 屏幕后处理特效模板
  4. Compute Shader 利用GPU并行性,处理与常规渲染无关计算
  5. Shader Variant Collection 减少Shader变体,增加效率,减少内存。太高端,先不管了。。。

    Unity中的Shader模板

顶点/片元着色器(Vertex/Fragment Shader):(Pass中写CG代码)

//自定义Shader属性名称,可带路径,例如下边Chan下名称Shader_1的Shader
Shader "Chan/Shader_1"
{
    //仅仅是让属性在Material面板中设置,可以在CG代码中定义变量,可以通过脚本向Shader传递这些属性值
    Properties
    {
        //各种属性定义 ShaderName("DisplayName",PropertyType) = DefaultValue
        //ShaderName = Shader中用到的变量名称
        //DisPlayName = Material面板代表ShaderName值的名称
        //DefaultValue = 设置一个默认值

        _Int("Int",Int) = 1
        _Float("Float",Float) = 0.5
        _Range("Range",Range(0.3,0.9)) = 0.6

        //四维向量
        _Color("Color",Color) = (1,1,1,1)
        _Vector("Vector",Vector) = (2,3,5,4)

        //内置纹理名称(white,black,gray,bump)
        _2D("2D",2D) = ""{}
        _3D("3D",3D) = "black"{}
        _Cube("Cube",Cube) = "white"{}
        //
        _MainTex ("Texture", 2D) = "white" {}
    }

    //一个Shader中可包含多个SubShader,最少有一个。Unity会扫描所有的SubShader语义块,
    //然后选择第一个能够在目标平台运行的SubShader,所有SubShader都不支持,Unity会调用Fallback语义指定的Shader
    SubShader
    {
        //标签设置 可选 key/value键值对形式 SubShader中定义和Pass中定义的标签类型不一样
        Tags { "RenderType"="Opaque" }
        //1.渲染状态设置 可选 在Pass中定义,对此SubShader中所有Pass适用,定义在某个Pass,只在定义的Pass中起作用
        //2.在SubShader中定义和Pass中定义使用的语法是相同的
        ZWrite On

        Pass
        {
            //标签设置 可选 和SubShader中的类型有区别
            //设置渲染状态 可选 和SubShader中的类型一致

            CGPROGRAM
            //CG语法
            ENDCG
        }
        Pass{...}
    }
    SubShader{...}
    SubShader{...}
    //上边三个SubShader都不支持,Unity会调用Fallback语义指定的Shader
    Fallback "Diffuse"
}

表面着色器(Surface Shader):(通过顶点/片元着色器抽象封装而来,处理了很多光照细节,SubShader中写CG代码)

Shader "Custom/NewSurfaceShader" {
	Properties {...}
	SubShader {
		//标签设置 可选
		//渲染状态设置 可选

		CGPROGRAM
		...
		void surf (Input IN, inout SurfaceOutputStandard o) 
		{...}
		ENDCG
	}
	FallBack "Diffuse"
}

 

固定函数着色器(Fixed Function Shader):(不能写CG代码,只能用Shaderlab语法)

Shader "Custom/Fixed Function" {
    Properties {
        _Color("Main Color",Color) = (1,1,1,1)
    }
    SubShader {
        Pass
        {
            Material
            {
                Diffuse[_Color]
            }
        }
        Lighting On
    }
}

 

Unity5.2后,固定函数着色器也是转化为顶点/片元着色器,因此Unity中只有一种Shader。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值