以下是“Unity图形学之ShaderLab入门基础”的完整攻略,包含两个示例。
简介
ShaderLab是Unity中用于编写着色器的语言,它是一种基于标记的语言,可以用于编写顶点着色器、片段着色器、表面着色器等。本攻略将详细讲解如何使用ShaderLab编写基本的着色器,并提供两个示例。
着色器语法
ShaderLab的语法由标记和标记块组成。标记以“#”开头,标记块由一对大括号“{}”包围。下面是一个简单的ShaderLab示例:
Shader "Custom/MyShader" {
Properties {
_MainTex ("Texture", 2D) = "white" {}
_Color ("Color", Color) = (1,1,1,1)
}
SubShader {
Tags { "RenderType"="Opaque" }
LOD 100
Pass {
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct appdata {
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};
struct v2f {
float2 uv : TEXCOORD0;
float4 vertex : SV_POSITION;
};
sampler2D _MainTex;
float4 _MainTex_ST;
float4 _Color;
v2f vert (appdata v) {
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = TRANSFORM_TEX(v.uv, _MainTex);
return o;
}
fixed4 frag (v2f i) : SV_Target {
fixed4 col = tex2D(_MainTex, i.uv) * _Color;
return col;
}
ENDCG
}
}
FallBack "Diffuse"
}
在上面的示例代码中,我们定义了一个名为“Custom/MyShader”的着色器,并在其中定义了两个属性:_MainTex和_Color。我们使用SubShader标记定义了一个子着色器,并在其中定义了一个Pass标记块。在Pass标记块中,我们使用CGPROGRAM标记块定义了一个CG程序,并在其中定义了一个顶点着色器和一个片段着色器。
示例一
在这个示例中,我们将创建一个简单的着色器,并将其应用于一个立方体上。
- 创建一个新的3D游戏,并将其命名为“ShaderDemo”。
- 在场景中创建一个立方体,并将其命名为“Cube”。
- 在Project视图中创建一个新的着色器,并将其命名为“CustomShader”。
- 双击“CustomShader”打开着色器编辑器。
- 在着色器编辑器中,将着色器语言设置为“ShaderLab”。
- 在着色器编辑器中,编写以下代码:
Shader "Custom/MyShader" {
Properties {
_MainTex ("Texture", 2D) = "white" {}
_Color ("Color", Color) = (1,1,1,1)
}
SubShader {
Tags { "RenderType"="Opaque" }
LOD 100
Pass {
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct appdata {
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};
struct v2f {
float2 uv : TEXCOORD0;
float4 vertex : SV_POSITION;
};
sampler2D _MainTex;
float4 _MainTex_ST;
float4 _Color;
v2f vert (appdata v) {
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = TRANSFORM_TEX(v.uv, _MainTex);
return o;
}
fixed4 frag (v2f i) : SV_Target {
fixed4 col = tex2D(_MainTex, i.uv) * _Color;
return col;
}
ENDCG
}
}
FallBack "Diffuse"
}
在上面的示例代码中,我们定义了一个名为“Custom/MyShader”的着色器,并在其中定义了两个属性:_MainTex和_Color。我们使用SubShader标记定义了一个子着色器,并在其中定义了一个Pass标记块。在Pass标记块中,我们使用CGPROGRAM标记块定义了一个CG程序,并在其中定义了一个顶点着色器和一个片段着色器。
- 将“CustomShader”应用于“Cube”对象上。
示例二
在这个示例中,我们将创建一个简单的着色器,并将其应用于一个球体上,并使用代码控制球体的颜色。
- 创建一个新的3D游戏,并将其命名为“ShaderDemo”。
- 在场景中创建一个球体,并将其命名为“Sphere”。
- 在Project视图中创建一个新的着色器,并将其命名为“CustomShader”。
- 双击“CustomShader”打开着色器编辑器。
- 在着色器编辑器中,将着色器语言设置为“ShaderLab”。
- 在着色器编辑器中,编写以下代码:
Shader "Custom/MyShader" {
Properties {
_Color ("Color", Color) = (1,1,1,1)
}
SubShader {
Tags { "RenderType"="Opaque" }
LOD 100
Pass {
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct appdata {
float4 vertex : POSITION;
};
struct v2f {
float4 vertex : SV_POSITION;
fixed4 color : COLOR;
};
float4 _Color;
v2f vert (appdata v) {
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.color = _Color;
return o;
}
fixed4 frag (v2f i) : SV_Target {
return i.color;
}
ENDCG
}
}
FallBack "Diffuse"
}
在上面的示例代码中,我们定义了一个名为“Custom/MyShader”的着色器,并在其中定义了一个属性:_Color。我们使用SubShader标记定义了一个子着色器,并在其中定义了一个Pass标记块。在Pass标记块中,我们使用CGPROGRAM标记块定义了一个CG程序,并在其中定义了一个顶点着色器和一个片段着色器。
- 将“CustomShader”应用于“Sphere”对象上。
- 在“Sphere”对象上添加一个脚本组件,并将其命名为“ColorScript”。
- 在“ColorScript”脚本中,编写以下代码:
using UnityEngine;
public class ColorScript : MonoBehaviour
{
public Color color = Color.white;
void Update()
{
Renderer renderer = GetComponent<Renderer>();
renderer.material.SetColor("_Color", color);
}
}
在上面的示例代码中,我们在Update()方法中使用GetComponent()方法获取Renderer组件,并使用material.SetColor()方法设置着色器的颜色属性。
- 在Inspector视图中,将“ColorScript”的color属性设置为所需的颜色。
结论
本攻略介绍了如何使用ShaderLab编写基本的着色器,并提供了两个示例。ShaderLab是Unity中用于编写着色器的语言,它是一种基于标记的语言,可以用于编写顶点着色器、片段着色器、表面着色器等。通过学习ShaderLab,您可以更好地理解Unity中的图形学原理,并创建自己的着色器。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Unity图形学之ShaderLab入门基础 - Python技术站