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 | } |