文章目录
- 前言
- 一、精简 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 BackBlend One ZeroZTest LEqualZWrite OnHLSLPROGRAM#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类型:一般用于 颜色 这些精度较小的值