Unity Shader学习笔记:简单的shader

来源:互联网 发布:淘宝店铺首页图片设置? 编辑:程序博客网 时间:2024/04/30 06:32
Shader "Own/Chapter5-SimpleShader"{    Properties{        //声明一个Color类型的属性        _Color("Color Tint",Color) = (1.0,1.0,1.0,1.0)    }    SubShader{        Pass{            CGPROGRAM                #pragma vertex vert                #pragma fragment frag                //在CG代码中,我们需要定义一个与属性名称和类型都匹配的变量                fixed4 _Color;                //使用一个结构体定义顶点着色器的输入                struct a2v{                    //POSITION语义告诉Unity,用模型空间的顶点坐标填充vertex变量                    float4 vertex : POSITION;                    //NORMAL语义告诉Unity,用模型空间的切线方向填充normal变量                    float3 normal : NORMAL;                    //TEXCOORD0语义告诉Unity,用模型的第一套纹理坐标填充texcoord变量                    float4 texcoord : TEXCOORD0;                };                //使用一个结构体来定义顶点着色器的输出                struct v2f{                    //SV_POSTION语义告诉Unity,pos里包含了顶点在裁剪空间中的位置信息                    float4 pos : SV_POSITION;                    //COLOR0语义可以用于存储颜色信息                    fixed3 color : COLOR0;                };                v2f vert(a2v v){                    //声明输出结构                    v2f o;                    o.pos = mul(UNITY_MATRIX_MVP,v.vertex);                    //v.normal包含了顶点的法线方向,其分量范围在[-1.0,1.0]                    //下面的代码将分量范围映射到了[0.0,1.0]                    //存储到o.color中传递给片元着色器                    o.color = v.normal * 0.5 + fixed3(0.5,0.5,0.5);                    return o;                }                fixed4 frag(v2f i) : SV_Target{                    fixed3 c = i.color;                    //使用_Color属性来控制输出颜色                    c *= _Color.rgb;                    return fixed4(c,1.0);                }            ENDCG        }    }}

1.使用CGPROGRAM和ENDCG包围CG代码片段
2.#pragma vertex vert
#pragma fragment frag
声明顶点着色器对应的函数,声明片元着色器对应的函数
3.Unity支持的语义有:POSITION,TANGENT,NORMAL,TEXCOORD0,TEXCOORD1,TEXCOORD2,TEXCOORD3,COLOR等
4.ShaderLab属性类型和Cg变量类型的匹配关系

ShaderLab属性类型       Cg变量类型Color,Vector            float4,half4,fixed4Range,Float             float,half,fixed2D                      sampler2DCube                    samplerCube3D                      sampler3D

5.unity的内置包含文件下载地址:Unity Shader
Unity中常见的包含文件

文件名                             描述UnityCG.cginc                       包含了最常使用的帮助函数、宏和结构体等UnityShaderVariables.cginc          在编译Unity Shader时,会被自动包含进来。包含了许多内置的全局变量,如UNITY_MATRIX_MVP等Lighting.cginc                      包含了各种内置的光照模型,如果编写的是Surface Shader的话,会自动包含进来HLSLSupport.cginc                   在编译Unity Shader时,会自动包含进来。声明了很多用于跨平台编译的宏和定义

UnityCG.cginc中一些常用的结构体

名称                描述                      包含的变量appdata_base      可用于顶点着色器的输入      顶点位置,顶点法线,第一组纹理坐标appdata_tan       可用于顶点着色器的输入      顶点位置,顶点切线,顶点法线,第一组纹理坐标appdata_full      可用于顶点着色器的输入      顶点位置,顶点切线,顶点法线,四组(或者更多)纹理坐标appdata_img       可用于顶点着色器的输入      顶点位置,第一组纹理坐标v2f_img           可用于顶点着色器的输出      裁剪空间中的位置,纹理坐标

UnityCG.cginc中一些常用的帮助函数

函数名                                              描述float3 WorldSpaceViewDir(float4 v)                   输入一个模型空间中的顶点位置,返回世界空间中从该点到摄像机的观察方向float3 ObjSpaceViewDir(float4 v)                     输入一个模型空间中的顶点位置,返回模型空间中从该点到摄像机的观察方向float3 WorldSpaceLightDir(float4 v)                  仅可用于前向渲染中。输入一个模型空间中的顶点位置,返回世界空间中从该点到光源的光照方向。没有被                                                     归一化float3 ObjSpaceLightDir(float4 v)                    仅可用于前向渲染中。输入一个模型空间中的顶点位置,返回模型空间中从该点到光源的光照方向。没有被                                                     归一化float3 UnityObjectToWorldNormal(float3 norm)         把法线方向从模型空间转换到世界空间中float3 UnityObjectToWorldDir(float3 dir)             把方向矢量从模型空间变换到世界空间中float3 UnityWorldToObjectDir(float3 dir)             把方向矢量从世界空间变化到模型空间中

从应用阶段传递模型数据给顶点着色器时Unity支持的常用语义

语义                                      描述POSITION                                模型空间中的顶点位置,通常是float4类型NORMAL                                  顶点法线,通常是float3类型TANGENT                                 顶点切线,通常是float4类型TEXCOORDn,如TEXCOORD0,TEXCOORD1        该顶点的纹理坐标,TEXCOORD0表示第一组纹理坐标,依此类推。通常是float2或float4类型COLOR                                   顶点颜色,通常是fixed4或float4类型

其中TEXCOORDn中n的数目是和Shader Model有关的,例如一般在Shader Model2(即Unity默认编译到的Shader Model版本)和Shader Model3中,n等于8,而在Shader Model4和Shader Model5中,n等于16.

从顶点着色器传递数据给片元着色器时Unity使用的常见语义

语义                                描述SV_POSITION                        裁剪空间中的顶点坐标,结构体中必须包含一个用该语义修饰的变量。等同于DirectX9中的POSITION,但最好使用SV_POSITIONCOLOR0                             通常用于输出第一组顶点颜色,但不是必需的COLOR1                             通常用于输出第二组顶点颜色,但不是必需的TEXCOORD0~TEXCOORD7                通常用于输出纹理坐标,但不是必需的

片元着色器输出时Unity支持的常用语义

语义            描述SV_Target     输出值将会存储到渲染目标中。等同于DirectX9中的COLOR语义,但最好使用SV_Target

Cg/HLSL中3种精度的数值类型

类型               精度float            最高精度的浮点值。通常使用32位来存储half             中等精度的浮点值。通常使用16位来存储,精度范围是-60000 ~ +60000fixed            最低精度的浮点值。通常使用11位来存储,精度范围是-2.0 ~ +2.0

Unity支持的Shader Target

指令                           描述#pragma target 2.0           //默认的Shader Target等级。相当于Direct3D 9上的Shader Model2.0,不支持对顶点纹理的采样不支持显式的LOD纹理采样等#pragma target 3.0           //相当于Direct3D 9上的Shader Model 3.0,支持对顶点纹理的采样#pragma target 4.0           //相当于Direct3D 10上的Shader Model 4.0,支持几何着色器等#pragma target 5.0           //相当于Direct3D 11上的Shader Model 5.0
原创粉丝点击