unity shader CG
时间: 2025-01-15 15:50:38 浏览: 54
### Unity 中使用 CG 编写 Shader 的指南
在 Unity 渲染管线中,Shader 是实现自定义渲染效果的关键组件之一。通过使用 Cg/HLSL 语言编写的着色器程序可以控制物体表面的颜色、光照反应和其他视觉属性。
#### 创建基本的 Surface Shader
Surface Shaders 提供了一种简化的方式来自动生成顶点和片段函数。下面是一个简单的 Diffuse 表面材质的例子:
```c
Shader "Custom/DiffuseExample"
{
Properties {
_Color ("Main Color", Color) = (1,1,1,1)
_MainTex ("Base (RGB)", 2D) = "white" {}
}
SubShader {
Tags { "RenderType"="Opaque" }
CGPROGRAM
#pragma surface surf Lambert
sampler2D _MainTex;
fixed4 _Color;
struct Input {
float2 uv_MainTex;
};
void surf(Input IN, inout SurfaceOutput o) {
half4 c = tex2D(_MainTex, IN.uv_MainTex);
o.Albedo = c.rgb * _Color.rgb;
o.Alpha = c.a;
}
ENDCG
}
Fallback "Diffuse"
}
```
这段代码创建了一个带有纹理贴图的基础漫反射材质[^1]。
#### 使用 Vertex 和 Fragment 函数构建更复杂的 Effect
对于更加精细的效果,则可以直接编写 vertex/fragment shaders 来获得完全的手动控制权。这里展示如何制作一个简单的透明度测试效果:
```c
Shader "Custom/AlphaTested"
{
Properties {
_Color ("Main Color", Color) = (1,1,1,1)
_MainTex ("Base (RGB), Alpha (A)", 2D) = "white" {}
_Cutoff ("Alpha cutoff", Range(0,1)) = 0.5
}
SubShader {
Tags {"Queue"="AlphaTest" "IgnoreProjector"="True" "RenderType"="TransparentCutout"}
LOD 200
Pass {
Name "FORWARD"
Tags { "LightMode"="ForwardBase"}
CGPROGRAM
#pragma multi_compile_fwdbase nolightmap nodirlightmap novertexlight
#pragma target 3.0
#include "UnityCG.cginc"
uniform sampler2D _MainTex;
uniform fixed4 _Color;
uniform float _Cutoff;
struct appdata_t {
float4 vertex : POSITION;
float2 texcoord : TEXCOORD0;
};
struct v2f {
float4 pos : SV_POSITION;
float2 uv : TEXCOORD0;
};
v2f vert(appdata_t v) {
v2f o;
o.pos = UnityObjectToClipPos(v.vertex);
o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);
return o;
}
fixed4 frag(v2f i) : COLOR {
fixed4 col = tex2D(_MainTex, i.uv) * _Color;
clip(col.a - _Cutoff); // Discard pixels below alpha threshold.
return col;
}
ENDCG
}
}
}
```
此示例展示了如何设置裁剪操作来丢弃不满足特定条件的像素。
阅读全文
相关推荐



















