CommandBuffer的相关内容参考如下,其用于扩展Build-in的管线,(LWRP中是否好用呢?)
https://docs.unity3d.com/Manual/GraphicsCommandBuffers.html
总结几点:
public void OnWillRenderObject() 中创建 CommandBuffer
buf.Blit (BuiltinRenderTextureType.CurrentActive, screenCopyID);获取当前Buffer中的颜色信息
其与GrabTexture原理是一样的。只不过后者在一些平台上支持不是很好。
模糊的代码如下:
// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
Shader "Hidden/SeparableGlassBlur" {
Properties {
_MainTex ("Base (RGB)", 2D) = "" {}
}
CGINCLUDE
#include "UnityCG.cginc"
struct v2f {
float4 pos : POSITION;
float2 uv : TEXCOORD0;
float4 uv01 : TEXCOORD1;
float4 uv23 : TEXCOORD2;
float4 uv45 : TEXCOORD3;
};
float4 offsets;
sampler2D _MainTex;
v2f vert (appdata_img v) {
v2f o;
o.pos = UnityObjectToClipPos(v.vertex);
o.uv.xy = v.texcoord.xy;
o.uv01 = v.texcoord.xyxy + offsets.xyxy * float4(1,1, -1,-1);
o.uv23 = v.texcoord.xyxy + offsets.xyxy * float4(1,1, -1,-1) * 2.0;
o.uv45 = v.texcoord.xyxy + offsets.xyxy * float4(1,1, -1,-1) * 3.0;
return o;
}
half4 frag (v2f i) : COLOR {
half4 color = float4 (0,0,0,0);
color += 0.40 * tex2D (_MainTex, i.uv);
color += 0.15 * tex2D (_MainTex, i.uv01.xy);
color += 0.15 * tex2D (_MainTex, i.uv01.zw);
color += 0.10 * tex2D (_MainTex, i.uv23.xy);
color += 0.10 * tex2D (_MainTex, i.uv23.zw);
color += 0.05 * tex2D (_MainTex, i.uv45.xy);
color += 0.05 * tex2D (_MainTex, i.uv45.zw);
return color;
}
ENDCG
Subshader {
Pass {
ZTest Always Cull Off ZWrite Off
Fog { Mode off }
CGPROGRAM
#pragma fragmentoption ARB_precision_hint_fastest
#pragma vertex vert
#pragma fragment frag
ENDCG
}
}
Fallback off
} // shader
LWRP中引入了新的方式,但以下两个Texture,在ShaderGraph中
对应以下两个结点,如下所示,通过屏幕坐标,做为UV对SceneColor进行采样,并进行简单的抖动
效果如下:
Shader的代码,我们可以看到,以下代码是开启了Opaque功能
// Defines generated by graph
#define REQUIRE_OPAQUE_TEXTURE
简单总结一下Shader Graph的生成的代码
由三个Pass组成StandardUnlit ShadowCaster DepthOnly 后两者根据名字也能知道其使用了。与标准管线基本一致。
获取物体的Clip后坐标为o.position = TransformObjectToHClip(v.vertex.xyz);
Shader "Unlit Master"
{
Properties
{
[NoScaleOffset] Texture2D_102D9201("Texture2D", 2D) = "white" {}
}
SubShader
{
Tags
{
"RenderPipeline"="LightweightPipeline"
"RenderType"="Transparent"
"Queue"="Transparent+0"
}
Pass
{
Name "StandardUnlit"
Tags{"LightMode" = "LightweightForward"}
// Material options generated by graph
Blend SrcAlpha OneMinusSrcAlpha, One OneMinusSrcAlpha
Cull Back
ZTest LEqual
ZWrite Off
HLSLPROGRAM
// Required to compile gles 2.0 with standard srp library
#pragma prefer_hlslcc gles
#pragma exclude_renderers d3d11_9x
#pragma target 2.0
// -------------------------------------
// Lightweight Pipeline keywords
#pragma shader_feature _SAMPLE_GI
// -------------------------------------
// Unity defined keywords
#pragma multi_compile _ DIRLIGHTMAP_COMBINED
#pragma multi_compile _ LIGHTMAP_ON
#pragma multi_compile_fog
//--------------------------------------
// GPU Instancing
#pragma multi_compile_instancing
#pragma vertex vert
#pragma fragment frag
// Defines generated by graph
#define REQUIRE_OPAQUE_TEXTURE
// Lighting include is needed because of GI
#include "Packages/com.unity.render-pipelines.lightweight/ShaderLibrary/Core.hlsl"
#include "Packages/com.unity.render-pipelines.lightweight/ShaderLibrary/Lighting.hlsl"
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl"
#include "Packages/com.unity.render-pipelines.lightweight/ShaderLibrary/ShaderGraphFunctions.hlsl"
#include "Packages/com.unity.render-pipelines.lightweight/Shaders/UnlitInput.hlsl"
CBUFFER_START(UnityPerMaterial)
CBUFFER_END
TEXTURE2D(Texture2D_102D9201); SAMPLER(samplerTexture2D_102D9201); float4 Texture2D_102D9201_TexelSize;
struct VertexDescriptionInputs
{
float3 ObjectSpacePosition;
};
struct SurfaceDescriptionInputs
{
float4 ScreenPosition;
};
inline float unity_noise_randomValue (float2 uv)
{
return frac(sin(dot(uv, float2(12.9898, 78.233)))*43758.5453);
}
inline float unity_noise_interpolate (float a, float b, float t)
{
return (1.0-t)*a + (t*b);
}
inline float unity_valueNoise (float2 uv)
{
float2 i = floor(uv);
float2 f = frac(uv);
f = f * f * (3.0 - 2.0 * f);
uv = abs(frac(uv) - 0.5);
float2 c0 = i + float2(0.0, 0.0);
float2 c1 = i + float2(1.0, 0.0);
float2 c2 = i + float2(0.0, 1.0);
float2 c3 = i + float2(1.0, 1.0);
float r0 = unity_noise_randomValue(c0);
float r1 = unity_noise_randomValue(c1);
float r2 = unity_noise_randomValue(c2);
float r3 = unity_noise_randomValue(c3);
float bottomOfGrid = unity_noise_interpolate(r0, r1, f.x);
float topOfGrid = unity_noise_interpolate(r2, r3, f.x);
float t = unity_noise_interpolate(bottomOfGrid, topOfGrid, f.y);
return t;
}
void Unity_SimpleNoise_float(float2 UV, float Scale, out float Out)
{
float t = 0.0;
float freq = pow(2.0, float(0));
float amp = pow(0.5, float(3-0));
t += unity_valueNoise(float2(UV.x*Scale/freq, UV.y*Scale/freq))*amp;
freq = pow(2.0, float(1));
amp = pow(0.5, float(3-1));
t += unity_valueNoise(float2(UV.x*Scale/freq, UV.y*Scale/freq))*amp;
freq = pow(2.0, float(2));
amp = pow(0.5, float(3-2));
t += unity_valueNoise(float2(UV.x*Scale/freq, UV.y*Scale/freq))*amp;
Out = t;
}
void Unity_Multiply_float (float A, float B, out float Out)
{
Out = A * B;
}
void Unity_Add_float4(float4 A, float4 B, out float4 Out)
{
Out = A + B;
}
void Unity_SceneColor_float(float4 UV, out float3 Out)
{
Out = SHADERGRAPH_SAMPLE_SCENE_COLOR(UV.xy);
}
struct VertexDescription
{
float3 Position;
};
VertexDescription PopulateVertexData(VertexDescriptionInputs IN)
{
VertexDescription description = (VertexDescription)0;
description.Position = IN.ObjectSpacePosition;
return description;
}
struct SurfaceDescription
{
float3 Color;
float Alpha;
float AlphaClipThreshold;
};
SurfaceDescription PopulateSurfaceData(SurfaceDescriptionInputs IN)
{
SurfaceDescription surface = (SurfaceDescription)0;
float4 _ScreenPosition_2380931F_Out_0 = float4(IN.ScreenPosition.xy / IN.ScreenPosition.w, 0, 0);
float _SimpleNoise_8A18829C_Out_2;
Unity_SimpleNoise_float((_ScreenPosition_2380931F_Out_0.xy), 400, _SimpleNoise_8A18829C_Out_2);
float _Multiply_EE313A7A_Out_2;
Unity_Multiply_float(_SimpleNoise_8A18829C_Out_2, 0.05, _Multiply_EE313A7A_Out_2);
float4 _Add_1B1F2C98_Out_2;
Unity_Add_float4(_ScreenPosition_2380931F_Out_0, (_Multiply_EE313A7A_Out_2.xxxx), _Add_1B1F2C98_Out_2);
float3 _SceneColor_40727221_Out_1;
Unity_SceneColor_float(_Add_1B1F2C98_Out_2, _SceneColor_40727221_Out_1);
surface.Color = _SceneColor_40727221_Out_1;
surface.Alpha = 1;
surface.AlphaClipThreshold = 0.5;
return surface;
}
struct GraphVertexInput
{
float4 vertex : POSITION;
float3 normal : NORMAL;
float4 tangent : TANGENT;
float4 texcoord1 : TEXCOORD1;
UNITY_VERTEX_INPUT_INSTANCE_ID
};
struct GraphVertexOutput
{
float4 position : POSITION;
// Interpolators defined by graph
float3 WorldSpacePosition : TEXCOORD3;
float3 WorldSpaceNormal : TEXCOORD4;
float3 WorldSpaceTangent : TEXCOORD5;
float3 WorldSpaceBiTangent : TEXCOORD6;
float3 WorldSpaceViewDirection : TEXCOORD7;
float4 ScreenPosition : TEXCOORD8;
half4 uv1 : TEXCOORD9;
UNITY_VERTEX_INPUT_INSTANCE_ID
UNITY_VERTEX_OUTPUT_STEREO
};
GraphVertexOutput vert (GraphVertexInput v)
{
GraphVertexOutput o = (GraphVertexOutput)0;
UNITY_SETUP_INSTANCE_ID(v);
UNITY_TRANSFER_INSTANCE_ID(v, o);
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
// Vertex transformations performed by graph
float3 WorldSpacePosition = mul(UNITY_MATRIX_M,v.vertex).xyz;
float3 WorldSpaceNormal = normalize(mul(v.normal,(float3x3)UNITY_MATRIX_I_M));
float3 WorldSpaceTangent = normalize(mul((float3x3)UNITY_MATRIX_M,v.tangent.xyz));
float3 WorldSpaceBiTangent = cross(WorldSpaceNormal, WorldSpaceTangent.xyz) * v.tangent.w;
float3 WorldSpaceViewDirection = _WorldSpaceCameraPos.xyz - mul(GetObjectToWorldMatrix(), float4(v.vertex.xyz, 1.0)).xyz;
float4 ScreenPosition = ComputeScreenPos(mul(GetWorldToHClipMatrix(), mul(GetObjectToWorldMatrix(), v.vertex)), _ProjectionParams.x);
float4 uv1 = v.texcoord1;
float3 ObjectSpacePosition = mul(UNITY_MATRIX_I_M,float4(WorldSpacePosition,1.0)).xyz;
VertexDescriptionInputs vdi = (VertexDescriptionInputs)0;
// Vertex description inputs defined by graph
vdi.ObjectSpacePosition = ObjectSpacePosition;
VertexDescription vd = PopulateVertexData(vdi);
v.vertex.xyz = vd.Position;
o.position = TransformObjectToHClip(v.vertex.xyz);
// Vertex shader outputs defined by graph
o.WorldSpacePosition = WorldSpacePosition;
o.WorldSpaceNormal = WorldSpaceNormal;
o.WorldSpaceTangent = WorldSpaceTangent;
o.WorldSpaceBiTangent = WorldSpaceBiTangent;
o.WorldSpaceViewDirection = WorldSpaceViewDirection;
o.ScreenPosition = ScreenPosition;
o.uv1 = uv1;
return o;
}
half4 frag (GraphVertexOutput IN ) : SV_Target
{
UNITY_SETUP_INSTANCE_ID(IN);
UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(IN);
// Pixel transformations performed by graph
float3 WorldSpacePosition = IN.WorldSpacePosition;
float3 WorldSpaceNormal = IN.WorldSpaceNormal;
float3 WorldSpaceTangent = IN.WorldSpaceTangent;
float3 WorldSpaceBiTangent = IN.WorldSpaceBiTangent;
float3 WorldSpaceViewDirection = IN.WorldSpaceViewDirection;
float4 ScreenPosition = IN.ScreenPosition;
float4 uv1 = IN.uv1;
SurfaceDescriptionInputs surfaceInput = (SurfaceDescriptionInputs)0;
// Surface description inputs defined by graph
surfaceInput.ScreenPosition = ScreenPosition;
SurfaceDescription surf = PopulateSurfaceData(surfaceInput);
float3 Color = float3(0.5, 0.5, 0.5);
float Alpha = 1;
float AlphaClipThreshold = 0;
// Surface description remap performed by graph
Color = surf.Color;
Alpha = surf.Alpha;
AlphaClipThreshold = surf.AlphaClipThreshold;
#if _AlphaClip
clip(Alpha - AlphaClipThreshold);
#endif
return half4(Color, Alpha);
}
ENDHLSL
}
Pass
{
Name "ShadowCaster"
Tags{"LightMode" = "ShadowCaster"}
ZWrite On ZTest LEqual
// Material options generated by graph
Cull Back
HLSLPROGRAM
// Required to compile gles 2.0 with standard srp library
#pragma prefer_hlslcc gles
#pragma exclude_renderers d3d11_9x
#pragma target 2.0
//--------------------------------------
// GPU Instancing
#pragma multi_compile_instancing
#pragma vertex ShadowPassVertex
#pragma fragment ShadowPassFragment
// Defines generated by graph
#include "Packages/com.unity.render-pipelines.lightweight/ShaderLibrary/Core.hlsl"
#include "Packages/com.unity.render-pipelines.lightweight/ShaderLibrary/Lighting.hlsl"
#include "Packages/com.unity.render-pipelines.lightweight/ShaderLibrary/ShaderGraphFunctions.hlsl"
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl"
CBUFFER_START(UnityPerMaterial)
CBUFFER_END
TEXTURE2D(Texture2D_102D9201); SAMPLER(samplerTexture2D_102D9201); float4 Texture2D_102D9201_TexelSize;
struct VertexDescriptionInputs
{
float3 ObjectSpacePosition;
};
struct SurfaceDescriptionInputs
{
};
struct VertexDescription
{
float3 Position;
};
VertexDescription PopulateVertexData(VertexDescriptionInputs IN)
{
VertexDescription description = (VertexDescription)0;
description.Position = IN.ObjectSpacePosition;
return description;
}
struct SurfaceDescription
{
float Alpha;
float AlphaClipThreshold;
};
SurfaceDescription PopulateSurfaceData(SurfaceDescriptionInputs IN)
{
SurfaceDescription surface = (SurfaceDescription)0;
surface.Alpha = 1;
surface.AlphaClipThreshold = 0.5;
return surface;
}
struct GraphVertexInput
{
float4 vertex : POSITION;
float3 normal : NORMAL;
float4 tangent : TANGENT;
float4 texcoord1 : TEXCOORD1;
UNITY_VERTEX_INPUT_INSTANCE_ID
};
struct VertexOutput
{
float2 uv : TEXCOORD0;
float4 clipPos : SV_POSITION;
// Interpolators defined by graph
float3 WorldSpacePosition : TEXCOORD3;
float3 WorldSpaceNormal : TEXCOORD4;
float3 WorldSpaceTangent : TEXCOORD5;
float3 WorldSpaceBiTangent : TEXCOORD6;
float3 WorldSpaceViewDirection : TEXCOORD7;
half4 uv1 : TEXCOORD8;
UNITY_VERTEX_INPUT_INSTANCE_ID
UNITY_VERTEX_OUTPUT_STEREO
};
float3 _LightDirection;
VertexOutput ShadowPassVertex(GraphVertexInput v)
{
VertexOutput o;
UNITY_SETUP_INSTANCE_ID(v);
UNITY_TRANSFER_INSTANCE_ID(v, o);
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
// Vertex transformations performed by graph
float3 WorldSpacePosition = mul(UNITY_MATRIX_M,v.vertex).xyz;
float3 WorldSpaceNormal = normalize(mul(v.normal,(float3x3)UNITY_MATRIX_I_M));
float3 WorldSpaceTangent = normalize(mul((float3x3)UNITY_MATRIX_M,v.tangent.xyz));
float3 WorldSpaceBiTangent = cross(WorldSpaceNormal, WorldSpaceTangent.xyz) * v.tangent.w;
float3 WorldSpaceViewDirection = _WorldSpaceCameraPos.xyz - mul(GetObjectToWorldMatrix(), float4(v.vertex.xyz, 1.0)).xyz;
float4 uv1 = v.texcoord1;
float3 ObjectSpacePosition = mul(UNITY_MATRIX_I_M,float4(WorldSpacePosition,1.0)).xyz;
VertexDescriptionInputs vdi = (VertexDescriptionInputs)0;
// Vertex description inputs defined by graph
vdi.ObjectSpacePosition = ObjectSpacePosition;
VertexDescription vd = PopulateVertexData(vdi);
v.vertex.xyz = vd.Position;
// Vertex shader outputs defined by graph
o.WorldSpacePosition = WorldSpacePosition;
o.WorldSpaceNormal = WorldSpaceNormal;
o.WorldSpaceTangent = WorldSpaceTangent;
o.WorldSpaceBiTangent = WorldSpaceBiTangent;
o.WorldSpaceViewDirection = WorldSpaceViewDirection;
o.uv1 = uv1;
float3 positionWS = TransformObjectToWorld(v.vertex.xyz);
float3 normalWS = TransformObjectToWorldNormal(v.normal);
float4 clipPos = TransformWorldToHClip(ApplyShadowBias(positionWS, normalWS, _LightDirection));
#if UNITY_REVERSED_Z
clipPos.z = min(clipPos.z, clipPos.w * UNITY_NEAR_CLIP_VALUE);
#else
clipPos.z = max(clipPos.z, clipPos.w * UNITY_NEAR_CLIP_VALUE);
#endif
o.clipPos = clipPos;
return o;
}
half4 ShadowPassFragment(VertexOutput IN ) : SV_TARGET
{
UNITY_SETUP_INSTANCE_ID(IN);
UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(IN);
// Pixel transformations performed by graph
float3 WorldSpacePosition = IN.WorldSpacePosition;
float3 WorldSpaceNormal = IN.WorldSpaceNormal;
float3 WorldSpaceTangent = IN.WorldSpaceTangent;
float3 WorldSpaceBiTangent = IN.WorldSpaceBiTangent;
float3 WorldSpaceViewDirection = IN.WorldSpaceViewDirection;
float4 uv1 = IN.uv1;
SurfaceDescriptionInputs surfaceInput = (SurfaceDescriptionInputs)0;
// Surface description inputs defined by graph
SurfaceDescription surf = PopulateSurfaceData(surfaceInput);
float Alpha = 1;
float AlphaClipThreshold = 0;
// Surface description remap performed by graph
Alpha = surf.Alpha;
AlphaClipThreshold = surf.AlphaClipThreshold;
#if _AlphaClip
clip(Alpha - AlphaClipThreshold);
#endif
return 0;
}
ENDHLSL
}
Pass
{
Name "DepthOnly"
Tags{"LightMode" = "DepthOnly"}
ZWrite On
ColorMask 0
// Material options generated by graph
Cull Back
HLSLPROGRAM
// Required to compile gles 2.0 with standard srp library
#pragma prefer_hlslcc gles
#pragma exclude_renderers d3d11_9x
#pragma target 2.0
//--------------------------------------
// GPU Instancing
#pragma multi_compile_instancing
#pragma vertex vert
#pragma fragment frag
// Defines generated by graph
#include "Packages/com.unity.render-pipelines.lightweight/ShaderLibrary/Core.hlsl"
#include "Packages/com.unity.render-pipelines.lightweight/ShaderLibrary/Lighting.hlsl"
#include "Packages/com.unity.render-pipelines.lightweight/ShaderLibrary/ShaderGraphFunctions.hlsl"
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl"
CBUFFER_START(UnityPerMaterial)
CBUFFER_END
TEXTURE2D(Texture2D_102D9201); SAMPLER(samplerTexture2D_102D9201); float4 Texture2D_102D9201_TexelSize;
struct VertexDescriptionInputs
{
float3 ObjectSpacePosition;
};
struct SurfaceDescriptionInputs
{
};
struct VertexDescription
{
float3 Position;
};
VertexDescription PopulateVertexData(VertexDescriptionInputs IN)
{
VertexDescription description = (VertexDescription)0;
description.Position = IN.ObjectSpacePosition;
return description;
}
struct SurfaceDescription
{
float Alpha;
float AlphaClipThreshold;
};
SurfaceDescription PopulateSurfaceData(SurfaceDescriptionInputs IN)
{
SurfaceDescription surface = (SurfaceDescription)0;
surface.Alpha = 1;
surface.AlphaClipThreshold = 0.5;
return surface;
}
struct GraphVertexInput
{
float4 vertex : POSITION;
float3 normal : NORMAL;
float4 tangent : TANGENT;
float4 texcoord1 : TEXCOORD1;
UNITY_VERTEX_INPUT_INSTANCE_ID
};
struct VertexOutput
{
float2 uv : TEXCOORD0;
float4 clipPos : SV_POSITION;
// Interpolators defined by graph
float3 WorldSpacePosition : TEXCOORD3;
float3 WorldSpaceNormal : TEXCOORD4;
float3 WorldSpaceTangent : TEXCOORD5;
float3 WorldSpaceBiTangent : TEXCOORD6;
float3 WorldSpaceViewDirection : TEXCOORD7;
half4 uv1 : TEXCOORD8;
UNITY_VERTEX_INPUT_INSTANCE_ID
UNITY_VERTEX_OUTPUT_STEREO
};
VertexOutput vert(GraphVertexInput v)
{
VertexOutput o = (VertexOutput)0;
UNITY_SETUP_INSTANCE_ID(v);
UNITY_TRANSFER_INSTANCE_ID(v, o);
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
// Vertex transformations performed by graph
float3 WorldSpacePosition = mul(UNITY_MATRIX_M,v.vertex).xyz;
float3 WorldSpaceNormal = normalize(mul(v.normal,(float3x3)UNITY_MATRIX_I_M));
float3 WorldSpaceTangent = normalize(mul((float3x3)UNITY_MATRIX_M,v.tangent.xyz));
float3 WorldSpaceBiTangent = cross(WorldSpaceNormal, WorldSpaceTangent.xyz) * v.tangent.w;
float3 WorldSpaceViewDirection = _WorldSpaceCameraPos.xyz - mul(GetObjectToWorldMatrix(), float4(v.vertex.xyz, 1.0)).xyz;
float4 uv1 = v.texcoord1;
float3 ObjectSpacePosition = mul(UNITY_MATRIX_I_M,float4(WorldSpacePosition,1.0)).xyz;
VertexDescriptionInputs vdi = (VertexDescriptionInputs)0;
// Vertex description inputs defined by graph
vdi.ObjectSpacePosition = ObjectSpacePosition;
VertexDescription vd = PopulateVertexData(vdi);
v.vertex.xyz = vd.Position;
// Vertex shader outputs defined by graph
o.WorldSpacePosition = WorldSpacePosition;
o.WorldSpaceNormal = WorldSpaceNormal;
o.WorldSpaceTangent = WorldSpaceTangent;
o.WorldSpaceBiTangent = WorldSpaceBiTangent;
o.WorldSpaceViewDirection = WorldSpaceViewDirection;
o.uv1 = uv1;
o.clipPos = TransformObjectToHClip(v.vertex.xyz);
return o;
}
half4 frag(VertexOutput IN ) : SV_TARGET
{
UNITY_SETUP_INSTANCE_ID(IN);
UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(IN);
// Pixel transformations performed by graph
float3 WorldSpacePosition = IN.WorldSpacePosition;
float3 WorldSpaceNormal = IN.WorldSpaceNormal;
float3 WorldSpaceTangent = IN.WorldSpaceTangent;
float3 WorldSpaceBiTangent = IN.WorldSpaceBiTangent;
float3 WorldSpaceViewDirection = IN.WorldSpaceViewDirection;
float4 uv1 = IN.uv1;
SurfaceDescriptionInputs surfaceInput = (SurfaceDescriptionInputs)0;
// Surface description inputs defined by graph
SurfaceDescription surf = PopulateSurfaceData(surfaceInput);
float Alpha = 1;
float AlphaClipThreshold = 0;
// Surface description remap performed by graph
Alpha = surf.Alpha;
AlphaClipThreshold = surf.AlphaClipThreshold;
#if _AlphaClip
clip(Alpha - AlphaClipThreshold);
#endif
return 0;
}
ENDHLSL
}
}
FallBack "Hidden/InternalErrorShader"
}