Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #ifndef TESS_CG_INCLUDED
- #define TESS_CG_INCLUDED
- #include "UnityCG.cginc"
- #include "AutoLight.cginc"
- #include "HLSLSupport.cginc"
- float _TessEdge;
- float _Displacement;
- float _distFalloff;
- float _fadeDist;
- uniform float4 _LightColor0;
- Texture2D _MainTex;
- SamplerState sampler_MainTex;
- uniform float4 _MainTex_ST;
- uniform float4 _BumpMap_ST;
- Texture2D _DispTex;
- SamplerState sampler_DispTex;
- Texture2D _BumpMap;
- SamplerState sampler_BumpMap;
- //Texture2D _SpecMap;
- //SamplerState sampler_SpecMap;
- struct appdata
- {
- float4 position : POSITION;
- float3 normal : NORMAL;
- float4 tangent : TANGENT;
- float2 uv : TEXCOORD;
- float3 lightDir : TEXCOORD1;
- float3 viewDir : COLOR;
- };
- struct PS_INPUT
- {
- float4 position : POSITION;
- float3 normal : NORMAL;
- float4 tangent : TANGENT;
- float2 uv : TEXCOORD;
- float3 lightDir : TEXCOORD1;
- float3 viewDir : COLOR;
- };
- struct PS_RenderOutput{
- float4 f4Color : SV_Target0;
- };
- struct HS_CONSTANT_OUTPUT
- {
- float edges[4] : SV_TessFactor;
- float inside[2] : SV_InsideTessFactor;
- };
- struct HS_OUTPUT
- {
- float3 position : POS;
- float3 normal : NORMAL;
- float2 uv : TEXCOORD;
- float4 tangent: TANGENT;
- float3 lightDir : TEXTCOORD1;
- float3 viewDir : COLOR;
- };
- void vert(inout appdata v){
- TANGENT_SPACE_ROTATION;
- // To view space
- v.position = mul(UNITY_MATRIX_MV, v.position);
- v.normal = mul ((float3x3)UNITY_MATRIX_IT_MV, v.normal);
- //v.uv = TRANSFORM_TEX(v.uv, _MainTex);
- v.lightDir = mul(rotation, ObjSpaceLightDir(v.position));
- v.viewDir = mul(rotation, ObjSpaceViewDir(v.position));
- //input.uv = I.uv;
- }
- HS_CONSTANT_OUTPUT HSConstant( InputPatch<appdata, 4> ip, uint pid : SV_PrimitiveID )
- {
- HS_CONSTANT_OUTPUT output;
- //float4 viewPos = mul(glstate.matrix.modelview[0], v.vertex);
- float distCoeff = (-ip[0].position.z * _distFalloff - _ProjectionParams.y)/_fadeDist; //ip[0].position.z * _distFalloff;//(ip[0].position.z - _ProjectionParams.y) * _distFalloff;
- output.edges[0] = _TessEdge / ((-ip[0].position.z - _ProjectionParams.y)/_fadeDist);
- output.edges[1] = _TessEdge / ((-ip[1].position.z - _ProjectionParams.y)/_fadeDist);
- output.edges[2] = _TessEdge / ((-ip[2].position.z - _ProjectionParams.y)/_fadeDist);
- output.edges[3] = _TessEdge / ((-ip[3].position.z - _ProjectionParams.y)/_fadeDist);
- output.inside[0] = _TessEdge / ((-ip[0].position.z - _ProjectionParams.y)/_fadeDist);
- output.inside[1] = _TessEdge / ((-ip[0].position.z - _ProjectionParams.y)/_fadeDist);
- return output;
- }
- [domain("quad")]
- [partitioning("integer")]
- [outputtopology("triangle_cw")]
- [outputcontrolpoints(4)]
- [patchconstantfunc("HSConstant")]
- HS_OUTPUT hull( InputPatch<appdata, 4> ip, uint cpid : SV_OutputControlPointID, uint pid : SV_PrimitiveID )
- {
- HS_OUTPUT Output;
- Output.position = ip[cpid].position;
- Output.normal = ip[cpid].normal;
- Output.uv = ip[cpid].uv;
- Output.lightDir = ip[cpid].lightDir;
- Output.tangent = ip[cpid].tangent;
- return Output;
- }
- [domain("quad")]
- appdata domain( HS_CONSTANT_OUTPUT input, float2 UV : SV_DomainLocation, const OutputPatch<HS_OUTPUT, 4> patch )
- {
- appdata Output;
- float3 topMidpoint = lerp(patch[0].position, patch[1].position, UV.x);
- float3 bottomMidpoint = lerp(patch[3].position, patch[2].position, UV.x);
- float3 position = lerp(topMidpoint, bottomMidpoint, UV.y);
- //Output.position = float4(lerp(topMidpoint, bottomMidpoint, UV.y), 1);
- //
- //O.f4Diffuse.a = 1.0f;
- float2 uvtopMidpoint = lerp(patch[0].uv, patch[1].uv, UV.x);
- float2 uvbottomMidpoint = lerp(patch[3].uv, patch[2].uv, UV.x);
- Output.uv = lerp(uvtopMidpoint, uvbottomMidpoint, UV.y);
- float3 normaltopMidpoint = lerp(patch[0].normal, patch[1].normal, UV.x);
- float3 normalbottomMidpoint = lerp(patch[3].normal, patch[2].normal, UV.x);
- //float4 pNormal = _BumpMap.Sample( sampler_BumpMap, input.uv );
- float3 normal = lerp(normaltopMidpoint, normalbottomMidpoint, UV.y);
- Output.normal= unity_LightColor[0].rgb * max( 0, dot( normal, unity_LightPosition[0].xyz ) ) + UNITY_LIGHTMODEL_AMBIENT.rgb;
- float disp = _DispTex.SampleLevel (sampler_DispTex, Output.uv, 0).r * _Displacement;
- position += normal * disp;
- Output.position = mul (UNITY_MATRIX_P, float4(position, 1));
- float3 lighttopMidpoint = lerp(patch[0].lightDir, patch[1].lightDir, UV.x);
- float3 lightbottomMidpoint = lerp(patch[3].lightDir, patch[2].lightDir, UV.x);
- //float4 pNormal = _BumpMap.Sample( sampler_BumpMap, input.uv );
- Output.lightDir = lerp(lighttopMidpoint, lightbottomMidpoint, UV.y);
- float4 tangenttopMidpoint = lerp(patch[0].tangent, patch[1].tangent, UV.x);
- float4 tangentbottomMidpoint = lerp(patch[3].tangent, patch[2].tangent, UV.x);
- //float4 pNormal = _BumpMap.Sample( sampler_BumpMap, input.uv );
- Output.tangent = lerp(tangentbottomMidpoint, tangenttopMidpoint, UV.y);
- return Output;
- }
- [domain("quad")]
- appdata vec_domain( HS_CONSTANT_OUTPUT input, float2 UV : SV_DomainLocation, const OutputPatch<HS_OUTPUT, 4> patch )
- {
- appdata Output;
- float3 topMidpoint = lerp(patch[0].position, patch[1].position, UV.x);
- float3 bottomMidpoint = lerp(patch[3].position, patch[2].position, UV.x);
- float3 position = lerp(topMidpoint, bottomMidpoint, UV.y);
- //Output.position = float4(lerp(topMidpoint, bottomMidpoint, UV.y), 1);
- //
- //O.f4Diffuse.a = 1.0f;
- float2 uvtopMidpoint = lerp(patch[0].uv, patch[1].uv, UV.x);
- float2 uvbottomMidpoint = lerp(patch[3].uv, patch[2].uv, UV.x);
- Output.uv = lerp(uvtopMidpoint, uvbottomMidpoint, UV.y);
- float3 normaltopMidpoint = lerp(patch[0].normal, patch[1].normal, UV.x);
- float3 normalbottomMidpoint = lerp(patch[3].normal, patch[2].normal, UV.x);
- //float4 pNormal = _BumpMap.Sample( sampler_BumpMap, input.uv );
- float3 normal = lerp(normaltopMidpoint, normalbottomMidpoint, UV.y);
- Output.normal= unity_LightColor[0].rgb * max( 0, dot( normal, unity_LightPosition[0].xyz ) ) + UNITY_LIGHTMODEL_AMBIENT.rgb;
- float disp = _DispTex.SampleLevel (sampler_DispTex, Output.uv, 0).r * _Displacement;
- position += normal * disp;
- Output.position = mul (UNITY_MATRIX_P, float4(position, 1));
- float3 lighttopMidpoint = lerp(patch[0].lightDir, patch[1].lightDir, UV.x);
- float3 lightbottomMidpoint = lerp(patch[3].lightDir, patch[2].lightDir, UV.x);
- //float4 pNormal = _BumpMap.Sample( sampler_BumpMap, input.uv );
- Output.lightDir = lerp(lighttopMidpoint, lightbottomMidpoint, UV.y);
- float4 tangenttopMidpoint = lerp(patch[0].tangent, patch[1].tangent, UV.x);
- float4 tangentbottomMidpoint = lerp(patch[3].tangent, patch[2].tangent, UV.x);
- //float4 pNormal = _BumpMap.Sample( sampler_BumpMap, input.uv );
- Output.tangent = lerp(tangentbottomMidpoint, tangenttopMidpoint, UV.y);
- return Output;
- }
- float4 frag( PS_INPUT input) : SV_TARGET{
- //float3 lightDir = normalize( _WorldSpaceLightPos0);
- half3 normal = UnpackNormal(_BumpMap.Sample( sampler_BumpMap, TRANSFORM_TEX(input.uv, _BumpMap) ));
- float4 Albedo = _MainTex.Sample( sampler_MainTex, TRANSFORM_TEX(input.uv, _MainTex) );
- float pxlAtten = dot( normal, normalize(input.lightDir ));
- float3 diff = Albedo * pxlAtten;
- //half4 c = SpecularColorLight( input.lightDir, input.viewDir, normal, Albedo, Albedo.rgb, Albedo.r, pxlAtten );
- return float4( diff, 1 ) * 0.5;
- //return Albedo;
- // float3 lightColor = float3(0,0,0);
- // float4 c = _MainTex.Sample( sampler_MainTex, TRANSFORM_TEX(input.uv, _MainTex) );
- // float3 n = UnpackNormal(_BumpMap.Sample( sampler_BumpMap, input.uv ));
- // float lengthSq = dot(input.lightDir, input.lightDir);
- // float atten = 1.0 / (1.0 + lengthSq * unity_LightAtten[0].z);
- // Angle to the light
- // float diff = saturate (dot (n, normalize(input.lightDir)));
- // lightColor += _LightColor0.rgb * (diff * atten);
- // c.rgb = lightColor * c.rgb;
- // return c;
- }
- #endif
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement