- 最后登录
- 2014-10-23
- 注册时间
- 2011-7-19
- 阅读权限
- 90
- 积分
- 81303
 
- 纳金币
- -1
- 精华
- 11
|
发表 本教程将教你如何编写自定义顶点和片段着色器的统一方案。一个基本的介绍ShaderLab看到入门教
程。
让我们开始了一个着色器的一般结构小回顾:
Shader "MyShaderName" {
Properties {
// ... properties here ...
}
SubShader {
// ... subshader for graphics hardware A ...
Pass {
// ... pass commands ...
}
// ... more passes if needed ...
}
SubShader {
// ... subshader for graphics hardware B ...
}
// ... Optional fallback ...
FallBack "VertexLit"
}
最后,我们在这里引入一个新的命令:
FallBack "VertexLit"
回退命令可用于在着色结束,它告诉它应该使用着色如果从目前的着色没有SubShaders可以运行在
用户的图形硬件。其效果是一样的,包括在年底从后备着色所有SubShaders相同。例如,如果你写了颠簸映射着色,然后不要写成一个非常基本的非凹凸映射的老显卡你可以回退到subshader内置VertexLit着色。
该着色的基本构建块,介绍了在第一渲染教程,而性能完整的文件,SubShaders并通过提供。
阿建设SubShaders快速方法是使用证在其他着色器定义。该命令UsePass正是如此,所以你可以重
用一个整洁时尚着色器代码。作为一个例子下面的命令使用的名称,通过“基地”从内置的镜面着色:
UsePass "Specular/BASE"
着色:顶点和片段程序
1
为了UsePass为了工作,这个名字必须考虑的一个传递希望使用。通过名称内的命令给它一个名字:
Name "MyPassName"
顶点和片段方案
我们描述了通过该只使用一个单一的纹理相结合的第一个教程指令。现在是时候证明我们如何能够通过使用我们的顶点和片段方案。
当您使用顶点和片段程序(即所谓“可编程管线”),大部分的硬编码功能(“固定功能管线”)在图形硬件已关闭。例如,使用一个顶点程序关闭标准3D变换,灯光和纹理坐标生成完全。同样地,使用任何一个片段程序替换纹理相结合,将在SetTexture命令定义的模式,因此SetTexture命令是没有必要的。
写作顶点/片断程序需要一个三维转换,照明和协调空间 - 透彻的认识,因为你必须重写固定功能是一样的OpenGL的API将自己的建造。另一方面,你可以做更多比内置的!
利用ShaderLab Cg语言在ShaderLab着色器通常用Cg语言嵌入“Cg的片段着色器中的文本”的编程语言。 Cg的片段被编译成低级的统一着色器组装编辑,最后着色是在你的游戏的数据中包含的文件只包含这个低层次的组装。
当您选择一个项目视图着色,检查员Cg语言编译后显示,这可能有助于在调试援助着色文本。统一自动编译的CG OpenGL和Direct3D的片段,所以你的着色器,使用Cg的工作都将只。请注意,因为企业管治守则是由编辑编译,你不能创建Cg的从脚本在运行时着色器。
一般来说,Cg的片段放在里面通行证块。他们看起来像这样:
Pass {
// ... the usual pass state setup ...
CGPROGRAM
// compilation directives for this snippet, e.g.:
#pragma vertex vert
#pragma fragment frag
// the Cg code itself
2
ENDCG
// ... the rest of pass setup ...
}
下面的例子演示了一个Cg的方案,使得对象的颜色正常人完全着色:
Shader "Tutorial/Display Normals" {
SubShader {
Pass {
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma fragmentoption ARB_fog_exp2
#include "UnityCG.cginc"
s***ct v2f {
V2F_POS_FOG;
float3 color : COLOR0;
};
v2f vert (appdata_base v)
{
v2f o;
PositionFog( v.vertex, o.pos, o.fog );
o.color = v.normal * 0.5 + 0.5;
return o;
}
half4 frag (v2f i) : COLOR
{
return half4( i.color, 1 );
}
ENDCG
}
}
Fallback "VertexLit"
}
3
当应用于一个对象,将图像中的结果如下(如果您的图形卡支持顶点和片段的过程中方案):
我们的“平均值显示”着色没有任何属性,包含一个是空的,除了单一的企业管治守则证单
SubShader。最后,向在VertexLit着色器内置的定义后备。让我们解剖了部分企业管治守则的一部
分:
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma fragmentoption ARB_fog_exp2
// ... snip ...
ENDCG
整个Cg的片段之间写入CGPROGRAM和ENDCG关键字。在开始编译指令#pragma指令给出:
#pragma vertex name告诉该代码包含在给定的函数(垂直这里顶点方案)。
#pragma fragment name告诉该代码包含在给定的函数有关水土这里(片断程序)。
#pragma fragmentoption name加上一个选项来编译OpenGL的片段方案。在这里,我们添加指数
平方雾支持。继汇编指令只是普通企业管治守则。我们首先包括一个内置的Cg的文件:
#include UnityCg.cginc
该文件包含常用UnityCg.cginc宣言等的着色器可以保持较小的功能。该文件本身是统一内发现的应用:/应用程序/统一/ Unity.app /目录/ CGIncludes / UnityCG.cginc。在这里,我们将使用
4
appdata_base结构,V2F_POS_FOG宏观和PositionFog从该文件助手作用。我们可以只定义它们直接在着色,不包括文件的过程。接下来,我们要定义一个片段“顶点”结构(这里命名为v2f) - 什么样的信息是从顶点传递到片断程序。我们通过标准的地位和雾参数和float3颜色参数。颜色将计算出的顶点程序和公正的片段程序的输出。
我们的出发定义的顶点程序 - 垂直功能。在这里,我们在计算标准方法使用UnityCG.cginc辅助功能(位置和雾)输入和输出作为一种颜色正常的:
! o.color = v.normal * 0.5 + 0.5;
正常的组成部分是-1 .. 1范围内,而色彩在0 .. 1范围内,所以我们在规模和偏见的代码高于正常。接
下来,我们定义一个片断程序 - 有关水土功能,只是颜色和产出计算为alpha组件1:
half4 frag (v2f i) : COLOR
{
return half4( i.color, 1 );
}
就这样,我们的着色完毕!即使这样简单的着色器是非常有用的可视化网格法线。
当然,这种着色不响应所有灯光,而这其中,事情变得有点复杂,对渲染管线和光衰减有关详细信息,参考网页阅读。
企业管治守则中使用着色性能当你定义的着色性能,你给他们一个像_Color或_MainTex名称。要使用Cg语言你他们只需要定义一个匹配的名称和类型的变量。统一将自动设置Cg的变量的名称与着色性能匹配。
下面是一个完整的着色器显示的颜色调制纹理。当然,你可以很容易地做一个纹理合成调用相同的,但问题是这里只是为了说明如何使用Cg的属性:
Shader "Tutorial/Textured Colored" {
Properties {
_Color ("Main Color", Color) = (1,1,1,0.5)
_MainTex ("Texture", 2D) = "white" { }
5
}
SubShader {
Pass {
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma fragmentoption ARB_fog_exp2
#include "UnityCG.cginc"
float4 _Color;
sampler2D _MainTex;
s***ct v2f {
V2F_POS_FOG;
float2 uv : TEXCOORD0;
};
v2f vert (appdata_base v)
{
v2f o;
PositionFog( v.vertex, o.pos, o.fog );
o.uv = TRANSFORM_UV(0);
return o;
}
half4 frag (v2f i) : COLOR
{
half4 texcol = tex2D( _MainTex, i.uv );
return texcol * _Color;
}
ENDCG
}
}
Fallback "VertexLit"
}
6
这种着色结构是在前面的例子一样。在这里,我们定义两个属性,即_Color和_MainTex。企业管治守则内我们定义相应的变量:
float4 _Color;
sampler2D _MainTex;
访问中看到着色性能更多信息,Cg语言。
顶点和片段程序在这里不做任何幻想;顶点程序使用从UnityCG.cginc的TRANSFORM_UV宏,以确保质地规模与偏移是正确应用,并片断程序公正样品的质地和颜色属性的繁殖。
请注意,因为我们正在编写我们自己的节目片段在这里,我们不需要任何SetTexture命令。如何纹理着色器适用于完全控制的片断程序。
摘要
我们已经展示了如何定制着色器程序可以在几个简单的步骤产生。虽然这里的例子所示很简单,没有什么阻止你写任意复杂的着色器程序!这可以帮助您采取统一充分利用,实现最佳的渲染效果。
完整的ShaderLab参考手册在这里。我们也有一个阴影在f***m.unity3d.com论坛,从而去那里得到你的着色器的帮助!编程快乐,享受团结和Shaderlab权力。
|
|