Unity Shader基本代码结构

发表于2018-07-10
评论0 3.3k浏览
固定管线shader和可编程shader的基础结构相同,只是稍微有些区别,本篇文章主要和大家介绍下Shader着色器中的基本代码结构,希望能帮到大家。

代码结构
//shader的名字会显示在unity的inspector中选择shader的菜单里面
Shader "Shader的路径和名称"{
    //属性
    [Properties]
    //可能存在多个subshader。Unity会在所有的subshader列表中选中第一个硬件可以支持的subshader
    SubShader{
        //SubShader的标签
        //[Tags]
        //给该SubShader中所有pass公用的设置
        //[Common State]
        [Common Tags]
        //可能存在多个pass,每个pass都会引起一次渲染
        Pass{
            //该Pass的标签
            [Tags]
            //渲染设置,如颜色混合
            [Render Setup]
            //纹理设置,只有在fixed function shader中才可用
            [Texture Setup]
        }
        //可以有其他的Pass
        [其他的Pass]
    }
    //可以有多个SubShader
    [其他的SubShader]
    //当所有的subshader失败时,使用Fallback指定的shader
    [Fallback]
    //当有自定义shader的设置UI时候用
    [CustomEditor]
}

演示

名字

属性

对比固定管线和可编程shader的基础结构

固定管线shader和可编程shader的基础结构是一样的,只是Render Setup部分不同。

Render Setup语法
1. 固定管线shader
使用ShaderLab命令组成Render Setup代码。

2. 可编程shader
使用CG/HLSL语言编写Render Setup代码。

使用CG语言编写一段简单的雾效shader的Render Setup部分如下所示:
CGPROGRAM                // 开始编写CG代码的标志
#pragma vertex vert      // 定义一个定点着色器的入口函数,#pragma vertex 自定义函数名
#pragma fragment frag    // 定义一个片段着色器的入口函数, #pragma fragment 自定义函数名
#include "UnityCG.cginc" // 文件包含在U3D的安装目录C:\Program Files\Unity\Editor\Data\CGIncludes,内置了很多数据和函数可供我们使用
// 数据结构名和变量名可以修改
// 定义顶点着色器的输入结构,通过预定义的语义从MeshRender中获取所需的顶点数据
struct appdata
{
    float4 vertex : POSITION;
    float2 uv : TEXCOORD0;
};
// 定义定点着色器的输出结构,同时也是片段着色器的输入结构,是两个着色器传递数据的桥梁
struct v2f
{
    float2 uv : TEXCOORD0;
    float4 vertex : SV_POSITION;
    float fogData : TEXCOORD1;
}
// 编写自定义的顶点着色器
v2f vert (appdata v)
{
    v2f o;
    o.vertex = UnityObjectToClipPos(v.vertex);
    o.uv = v.uv;
    return o;
}       
// CG中需要使用属性中定义的变量时,必须引用一下  
sampler2D _MainTex;
// 编写自定义的片元着色器函数,输出最终的颜色值
fixed4 frag (v2f i) : SV_Target
{
    fixed4 col = tex2D(_MainTex, i.uv)
    return col;
}
ENDCG

Unity Shader常用语义

POSITION获取模型顶点的信息
NORMAL:获取法线信息
TEXCOORD(n):高精度的从顶点着色器传递信息到片段着色器,比如自定义的值,可以是float、float2、float2、float4
COLOR低精度的从顶点着色器传递信息到片段着色器 float4
TANGENT获取切线信息
SV_POSITION经过mvp表示已经转化到屏幕坐标系(mvp)的坐标 顶点的三维左边已经编程了片段的二维坐标
SV_Target输出到哪个render target

常用的三种的顶点着色器获取fbx顶点信息的结构,可以自己增加或减少
struct appdata_base {
    float4 vertex : POSITION;
    float3 normal : NORMAL;
    float4 texcoord : TEXCOORD0;
    UNITY_VERTEX_INPUT_INSTANCE_ID
};

struct appdata_tan {
    float4 vertex : POSITION;
    float4 tangent : TANGENT;
    float3 normal : NORMAL;
    float4 texcoord : TEXCOORD0;
    UNITY_VERTEX_INPUT_INSTANCE_ID
};

struct appdata_full {
    float4 vertex : POSITION;
    float4 tangent : TANGENT;
    float3 normal : NORMAL;
    float4 texcoord : TEXCOORD0;
    float4 texcoord1 : TEXCOORD1;
    float4 texcoord2 : TEXCOORD2;
    float4 texcoord3 : TEXCOORD3;
    fixed4 color : COLOR;
    UNITY_VERTEX_INPUT_INSTANCE_ID
};
来自:https://blog.csdn.net/v_xchen_v/article/details/79406439

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引