设为首页 加入收藏

TOP

Unity SurfaceShader 编程起步
2015-07-24 05:57:08 来源: 作者: 【 】 浏览:7
Tags:Unity SurfaceShader 编程 起步

Unity SurfaceShader 编程起步


在14年年初的时候,曾经给自己定下了今年要实现的三个目标,其中之一就是学会编写自己的Shader,并能够投入到实际的项目应用之中。现在,转眼间日历已经翻到了6月份,而自己关于Shader的学习,还停留在三天打鱼两天晒网的零碎学习状态,自己心里很是着急。平时的工作任务多,挤掉了自己的学习时间是一方面。但更重要的,还是因为自己没有制定一个稳步的计划,来监督自己利用一切可以利用的时间完成学习的内容,相反,自己做的太过随意了。所以,继续以博文的形式来督促自己的学习,把关于shader学习的点滴都记录下来,并制定自己的学习进度计划,在规定的时间节点,必须完成计划的内容。迈出这一步,算是一个开始――Unity ShaderLab基础学习记录。

Unity 使用自定义的ShaderLab来组织Shader的内容,并针对不同的平台进行编译。在Unity自定义的ShaderLab中,通过SurfaceShader结构封装了能处理不同的照明及阴影,同时还能在Unity的两个渲染路径(Forward和Deferred)下正常工作的极具复杂性的Shader。SurfaceShader的基本结构如下所示:

Shader"Custom/NewShader" {

Properties {

// 一些属性,Shader的数据接口

}

SubShader {

// SubShader包装了一个渲染方案,这是我们编写Shader时的主阵地

}

SubShader {

// SubShader可有多个,这是为了能够让我们编写的Shader适应不同的显卡

}

FallBack "Diffuse"

}

我们在Properties块中能够定义的全部属性,如下所示:

Properties {

_Texture ("Texture",2D) = "white" {} // 图片(纹理)形式的属性

_Color ("Color",Color) = (1, 1, 1, 1) // 颜色属性

_Cube ("3D Map",Cube) = "white" {} //3D纹理,需要6张图片

_Vector ("Vector4",Vector) = (1, 1, 1, 1) // 4个元素的向量

_Float ("Float",float) = 1.0 //浮点数

_Range ("Range", range(-10,10)) = 1.0 // 限定范围的浮点数

}

在Unity的ShaderLab所提供的结构中,Shader的逻辑代码部分,都位于SubShader中的GLSLPROGRAM―ENDGLSL部分(GLSL语言),或者是CGPROGRAM―ENDCG部分(Cg/HLSL语言),我们可以选择不同的着色器语言来进行编写。

以上在Properties块中定义的属性,必须在逻辑代码块中(即GLSLPROGRAM―ENDGLSL或CGPROGRAM―ENDCG部分)再声明一次才能使用。它们在Cg代码中的声明方式如下:

CGPROGRAM

sampler2D _Texture;

float4 _Color;

samplerCUBE _Cube;

float4 _Vector;

float _Float;

float _Range;

… …

ENDCG

要格外注意的一点是,在Cg代码块中声明的变量名称必须与Properties块中变量的名称保持一致,否则会提示错误。

综上所述,一个SurfaceShader的完整代码为:

Shader"Custom/NewShader" {

Properties {

_MainTex("Texture",2D) = "white" {} // 图片(纹理)形式的属性

}

SubShader {

Tags {"RenderType"="Opaque" }

LOD 200

CGPROGRAM

#pragma surface surf Lambert

sampler2D _MainTex;

struct Input {

float2 uv_MainTex;

};

void surf (Input IN, inoutSurfaceOutput o) {

half4 c = tex2D(_MainTex, IN.uv_MainTex);

o.Albedo = c.rgb;

o.Alpha = c.a;

}

ENDCG

}

FallBack "Diffuse"

}

这也是在Unity中创建Shader的默认模板。关于这个默认的Shader模板中的一些内容,我在下一篇记录中会再进行分析,第一篇就到这里了: )

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇POJ 2019 Cornfields 二维线段树.. 下一篇数据结构 - 堆排序(heap sort) 详..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: