Unity Shader 入门(二)极简Shader实例

一言不合上代码

Shader "Demo/Diffuse None"{
    Properties{
    }
    SubShader{
        CGPROGRAM
            #pragma surface surf Lambert
            struct Input{
                float2 uv_Tex;
            };
            void surf(Input IN, inout SurfaceOutput o){
            }
        ENDCG
    }
    FallBack "Diffuse"
}

效果图

Unity Shader 入门(二)极简Shader实例_第1张图片
图2-1

代码分析

Shader "Demo/Diffuse Texture"

声明Shader并为其指定一个名字,在unity材质面板的Shader选项中可见。

Properties{
}

定义着色器的属性,作为输入提供为所有子着色器,在材质上作为可调参数显示出来。

SubShader{}

子着色器内容

        CGPROGRAM
            #pragma surface surf Lambert
            struct Input{
                float2 uv_Tex;
            };
            void surf(Input IN, inout SurfaceOutput o){
            }
        ENDCG

CGPROGRAM是一个开始标记,表明从这里开始是一段CG程序。最后一行的ENDCG表明CG程序到此结束。

#pragma surface surf Lambert

上面的代码表明这是一段编译指令,surface表示声明的是一个表面着色器,surf为表面着色器的实现方法,Lambert表示采用的光照模型(普通的diffuse)

struct Input{
    float2 uv_Tex;
};

由于方法surf(声明的suface的实现方法)有两个参数(为unity指定),第一个参数需要一个Input类型的结构体(Input需自定义,但必须命名为Input,结构体Input如果没有任何成员变量,unity编译会报错,所以本例定义了uv_Tex)CG程序约定,在一个贴图变量之前加上uv两个字母,表示提取它的uv值(其实就是贴图上点的二维坐标 )。之后在surf程序中可以直接通过访问uv_Tex来取得贴图当前需要计算的点的坐标值了。

FallBack "Diffuse"

如果没有适合的子着色器,则调用unity内置着色器Diffuse进行渲染。

你可能感兴趣的:(Unity Shader 入门(二)极简Shader实例)