文章目录
- 前言
- 一、精简 ShaderGraph 所有冗余代码后的最简 URP Shader
- 二、我们来对比一下 URP Shader 与 BuildInRP Shader 的对应关系 与 区别
- 1、"RenderPipeline"="UniversalPipeline"
- 2、面片剔除、深度测试、深度写入、颜色混合 和 BRP 下一致
- 3、必须引入的库变了
- 4、顶点着色器输入
- 5、片元着色器输入
- 6、顶点着色器
- 7、片元着色器
- 8、变量类型变化
- 最终效果
前言
在上篇文章中,我们主要把 ShaderGraph 转化为 URP Shader,并进行了最简化。在这篇文章中,我们来解析一下 URP 最简 Shader 中做了什么。
- Unity中Shader URP最简Shader框架(ShaderGraph 转 URP Shader)
一、精简 ShaderGraph 所有冗余代码后的最简 URP Shader
Shader "MyShader/URP/P2_10"
{
Properties {}
SubShader
{
Tags
{
//告诉引擎,该Shader只用于 URP 渲染管线
"RenderPipeline"="UniversalPipeline"
//渲染类型
"RenderType"="Opaque"
//渲染队列
"Queue"="Geometry"
}
Pass
{
Name "Universal Forward"
Tags
{
// LightMode: <None>
}
Cull Back
Blend One Zero
ZTest LEqual
ZWrite On
HLSLPROGRAM
#pragma vertex vert
#pragma fragment frag
// Pragmas
#pragma target 2.0
// Includes
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl"
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Input.hlsl"
//struct appdata
//顶点着色器的输入
struct Attributes
{
float3 positionOS : POSITION;
};
//struct v2f
//片元着色器的输入
struct Varyings
{
float4 positionCS : SV_POSITION;
};
//v2f vert(Attributes v)
//顶点着色器
Varyings vert(Attributes v)
{
Varyings o = (Varyings)0;
float3 positionWS = TransformObjectToWorld(v.positionOS);
o.positionCS = TransformWorldToHClip(positionWS);
return o;
}
//fixed4 frag(v2f i) : SV_TARGET
//片元着色器
half4 frag(Varyings i) : SV_TARGET
{
half4 c;
c.rgb = 0.5;
c.a = 1;
return c;
}
ENDHLSL
}
}
FallBack "Hidden/Shader Graph/FallbackError"
}
二、我们来对比一下 URP Shader 与 BuildInRP Shader 的对应关系 与 区别
1、“RenderPipeline”=“UniversalPipeline”
- 这句代码告诉Unity,我们Shader是用于哪一个渲染管线下的
2、面片剔除、深度测试、深度写入、颜色混合 和 BRP 下一致
3、必须引入的库变了
- BRP
#include “UnityCG.cginc”
- URP
#include “Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl”
#include “Packages/com.unity.render-pipelines.universal/ShaderLibrary/Input.hlsl”
4、顶点着色器输入
//struct appdata
//顶点着色器的输入
struct Attributes
{
float3 positionOS : POSITION;
};
- Attributes : appdata
- positionOS : position
- normalOS : normal
- tangentOS : tangent
5、片元着色器输入
//片元着色器的输入
struct Varyings
{
float4 positionCS : SV_POSITION;
};
- Varyings : v2f
- positionCS : position 在齐次裁剪坐标系下的顶点坐标
6、顶点着色器
//v2f vert(Attributes v)
//顶点着色器
Varyings vert(Attributes v)
{
Varyings o = (Varyings)0;
float3 positionWS = TransformObjectToWorld(v.positionOS);
o.positionCS = TransformWorldToHClip(positionWS);
return o;
}
- Varyings vert(Attributes v) : v2f vert(Attributes v)
- TransformObjectToWorld : mul(unity_ObjectToWorld,v.vertex)
- TransformWorldToHClip : UnityObjectToClipPos(v.vertex)
7、片元着色器
//fixed4 frag(v2f i) : SV_TARGET
//片元着色器
half4 frag(Varyings i) : SV_TARGET
{
half4 c;
c.rgb = 0.5;
c.a = 1;
return c;
}
- half4 frag(Varyings i) : fixed4 frag(v2f i)
8、变量类型变化
剔除了 fixed 类型变量
只保留:
- float类型:一般用于 坐标 和 位置 信息存储
- half类型:一般用于 颜色 这些精度较小的值