View difference between Paste ID: YMPdrqjM and 1aLzhC38
SHOW: | | - or go back to the newest paste.
1
// This shader adds tessellation in URP
2
Shader "Example/URPUnlitShaderTessallated"
3
{
4
5
	// The properties block of the Unity shader. In this example this block is empty
6
	// because the output color is predefined in the fragment shader code.
7
	Properties
8
	{
9
		_Tess("Tessellation", Range(1, 32)) = 20
10
		_MaxTessDistance("Max Tess Distance", Range(1, 32)) = 20
11
		_Noise("Noise", 2D) = "gray" {}
12
13
		_Weight("Displacement Amount", Range(0, 1)) = 0
14
	}
15
16
	// The SubShader block containing the Shader code. 
17
	SubShader
18
	{
19
		// SubShader Tags define when and under which conditions a SubShader block or
20
		// a pass is executed.
21
		Tags{ "RenderType" = "Opaque" "RenderPipeline" = "UniversalRenderPipeline" }
22
23
		Pass
24
		{
25
			Tags{ "LightMode" = "UniversalForward" }
26
27
28
			// The HLSL code block. Unity SRP uses the HLSL language.
29
			HLSLPROGRAM
30
			// The Core.hlsl file contains definitions of frequently used HLSL
31
			// macros and functions, and also contains #include references to other
32
			// HLSL files (for example, Common.hlsl, SpaceTransforms.hlsl, etc.).
33
			#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"    
34
			#include "CustomTessellation.hlsl"
35
36
			// This line defines the name of the hull shader. 
37
			#pragma hull hull
38
			// This line defines the name of the domain shader. 
39
			#pragma domain domain
40
			// This line defines the name of the vertex shader. 
41
			#pragma vertex TessellationVertexProgram
42
			// This line defines the name of the fragment shader. 
43
			#pragma fragment frag
44
45
			sampler2D _Noise;
46
			float _Weight;
47
48
			// pre tesselation vertex program
49
			ControlPoint TessellationVertexProgram(Attributes v)
50
			{
51
				ControlPoint p;
52
53
				p.vertex = v.vertex;
54
				p.uv = v.uv;
55
				p.normal = v.normal;
56
				p.color = v.color;
57
58
				return p;
59
			}
60
61
			// after tesselation
62
			Varyings vert(Attributes input)
63
			{
64
				Varyings output;
65
				
66
				float4 Noise = tex2Dlod(_Noise, float4(input.uv + (_Time.x * 0.1), 0, 0));
67
68
				input.vertex.xyz += normalize(input.normal) *  Noise.r * _Weight;
69
				output.vertex = TransformObjectToHClip(input.vertex.xyz);
70
				output.color = input.color;
71
				output.normal = input.normal;
72
				output.uv = input.uv;
73
				
74
				return output;
75
			}
76
77
			[UNITY_domain("tri")]
78
			Varyings domain(TessellationFactors factors, OutputPatch<ControlPoint, 3> patch, float3 barycentricCoordinates : SV_DomainLocation)
79
			{
80
				Attributes v;
81
				// interpolate the new positions of the tessellated mesh
82
				Interpolate(vertex)
83
				Interpolate(uv)
84
				Interpolate(color)
85
				Interpolate(normal)
86
87
				return vert(v);
88
			}
89
90
			// The fragment shader definition.            
91
			half4 frag(Varyings IN) : SV_Target
92
			{
93
				float4 Noise = tex2D(_Noise, IN.uv + (_Time.x * 0.1));
94
				return Noise;
95
			}
96
			ENDHLSL
97
		}
98
	}
99
}