11.ShaderLab-Shader编写形式-顶点片元着色器
11.1 知识点
知识回顾
表面着色器是Unity对顶点/片元着色器的封装,可以用更少的代码实现复杂的逻辑,但是性能和可控性较差。它的特点是:
- 直接在SubShader语句块中书写着色器逻辑。
- 我们不需要关心也不需要使用多个Pass,每个Pass如何渲染,Unity会在内部帮助我们去处理。
- 可以使用CG或HLSL两种Shader语言去编写Shader逻辑。
- 代码量较少,可控性较低,性能消耗较高。
- 适用于处理需要和各种光源打交道的着色器,但是在移动平台上需要注意性能表现。
顶点/片元着色器
- 我们可以在创建Shader时,选择创建Unlit Shader来快速创建顶点/片元着色器模板。
- 如下是默认的顶点/片元着色器。
Shader "ShaderTeach/Lesson11_NewUnlitShader"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 100
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
// make fog work
#pragma multi_compile_fog
#include "UnityCG.cginc"
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};
struct v2f
{
float2 uv : TEXCOORD0;
UNITY_FOG_COORDS(1)
float4 vertex : SV_POSITION;
};
sampler2D _MainTex;
float4 _MainTex_ST;
v2f vert (appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = TRANSFORM_TEX(v.uv, _MainTex);
UNITY_TRANSFER_FOG(o,o.vertex);
return o;
}
fixed4 frag (v2f i) : SV_Target
{
// sample the texture
fixed4 col = tex2D(_MainTex, i.uv);
// apply fog
UNITY_APPLY_FOG(i.fogCoord, col);
return col;
}
ENDCG
}
}
}
通过观察,我们发现顶点/片元着色器的着色器代码是编写在Pass语句块中,我们需要自己定义每个Pass需要使用的Shader代码。
虽然比起表面着色器来说我们需要编写的代码较多,但是好处是灵活性更高,可控性更强,可以控制更多的渲染细节,决定对性能影响的高低。
总结顶点/片元着色器的特点是:
- 需要在Pass渲染通道中编写着色器逻辑。
- 可以使用CG或HLSL两种Shader语言去编写Shader逻辑。
- 代码量较多,灵活性较强,性能消耗更可控,可以实现更多渲染细节。
- 适用于光照处理较少,自定义渲染效果较多时(移动平台首选)。
11.2 知识点代码
Lesson11_ShaderLab_Shader编写形式_顶点片元着色器
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Lesson11_ShaderLab_Shader编写形式_顶点片元着色器 : MonoBehaviour
{
void Start()
{
#region 知识回顾
//表面着色器是Unity对顶点/片元着色器的封装
//可以用更少的代码实现复杂的逻辑
//但是性能和可控性较差
//它的特点是
//1.直接在SubShader语句块中书写着色器逻辑
//2.我们不需要关心也不需要使用多个Pass,每个Pass如何渲染,Unity会在内部帮助我们去处理
//3.可以使用CG或HLSL两种Shader语言去编写Shader逻辑
//4.代码量较少,可控性较低,性能消耗较高
//5.适用于处理需要和各种光源打交道的着色器,但是在移动平台上需要注意性能表现
#endregion
#region 知识点 顶点/片元着色器
//我们可以在创建Shader时,选择创建Unlit Shader来快速创建顶点/片元着色器模板
//通过观察,我们发现
//顶点/片元着色器的着色器代码是编写在Pass语句块中
//我们需要自己定义每个Pass需要使用的Shader代码
//虽然比起表面着色器来说我们需要编写的代码较多
//但是好处是灵活性更高,可控性更强,可以控制更多的渲染细节
//决定对性能影响的高低
//它的特点是
//1.需要在Pass渲染通道中编写着色器逻辑
//2.可以使用CG或HLSL两种Shader语言去编写Shader逻辑
//3.代码量较多,灵活性较强,性能消耗更可控,可以实现更多渲染细节
//4.适用于光照处理较少,自定义渲染效果较多时(移动平台首选)
#endregion
}
}
Lesson11_NewUnlitShader.shader
Shader "ShaderTeach/Lesson11_NewUnlitShader"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 100
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
// make fog work
#pragma multi_compile_fog
#include "UnityCG.cginc"
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};
struct v2f
{
float2 uv : TEXCOORD0;
UNITY_FOG_COORDS(1)
float4 vertex : SV_POSITION;
};
sampler2D _MainTex;
float4 _MainTex_ST;
v2f vert (appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = TRANSFORM_TEX(v.uv, _MainTex);
UNITY_TRANSFER_FOG(o,o.vertex);
return o;
}
fixed4 frag (v2f i) : SV_Target
{
// sample the texture
fixed4 col = tex2D(_MainTex, i.uv);
// apply fog
UNITY_APPLY_FOG(i.fogCoord, col);
return col;
}
ENDCG
}
}
}
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com