43 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			43 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| Texture2D<float> In_HeightTex;
 | |
| Texture2D<float> In_BaseMaskTex;
 | |
| Texture2D<float> RemapTex;
 | |
| RWTexture2D<float> OutputTex;
 | |
| 
 | |
| float4 AspectValues;
 | |
| 
 | |
| float EffectStrength;
 | |
| int RemapTexRes;
 | |
| 
 | |
| float2 computeNormal(uint2 id, int epsilon)
 | |
| {
 | |
| 	uint left = id.x - epsilon;
 | |
| 	uint right = id.x + epsilon;
 | |
| 	uint up = id.y - epsilon;
 | |
| 	uint down = id.y + epsilon;
 | |
| 
 | |
| 	float dzdx = ((In_HeightTex[uint2(right, down)] + 2.0f * In_HeightTex[uint2(right, id.y)] + In_HeightTex[uint2(right, up)]) -
 | |
| 		(In_HeightTex[uint2(left, down)] + 2.0f * In_HeightTex[uint2(left, id.y)] + In_HeightTex[uint2(left, up)])) / 8.0f;
 | |
| 
 | |
| 	float dzdy = ((In_HeightTex[uint2(left, up)] + 2.0f * In_HeightTex[uint2(id.x, up)] + In_HeightTex[uint2(right, up)]) -
 | |
| 		(In_HeightTex[uint2(left, down)] + 2.0f * In_HeightTex[uint2(id.x, down)] + In_HeightTex[uint2(right, down)])) / 8.0f;
 | |
| 
 | |
| 	return normalize(float2(dzdx, dzdy));
 | |
| }
 | |
| 
 | |
| float GetAspectScale(uint2 id, float h)
 | |
| {
 | |
| 	float epsilon = AspectValues.z;
 | |
| 	float2 n = computeNormal(id, epsilon);
 | |
| 	float aspect = saturate(dot(n, AspectValues.xy));
 | |
| 
 | |
| 	uint remapIdx = (uint)(aspect * (float)(RemapTexRes - 1));
 | |
| 	return RemapTex[uint2(remapIdx, 0)];
 | |
| }
 | |
| 
 | |
| #pragma kernel AspectRemap
 | |
| [numthreads(1, 1, 1)]
 | |
| void AspectRemap(uint3 id : SV_DispatchThreadID)
 | |
| {
 | |
| 	float aspectMask = GetAspectScale(id.xy, In_HeightTex[id.xy]);
 | |
| 	OutputTex[id.xy] = lerp(1.0f, aspectMask, EffectStrength) * In_BaseMaskTex[id.xy];
 | |
| } | 
