Correctly calculate normals with dynamic tessellation
This commit is contained in:
		
							parent
							
								
									85533814e1
								
							
						
					
					
						commit
						b3aac984a7
					
				| 
						 | 
					@ -24,6 +24,7 @@ in VS_OUT {
 | 
				
			||||||
out TC_OUT {
 | 
					out TC_OUT {
 | 
				
			||||||
    vec3 position;
 | 
					    vec3 position;
 | 
				
			||||||
    vec2 texCoord;
 | 
					    vec2 texCoord;
 | 
				
			||||||
 | 
					    float tessLevel;
 | 
				
			||||||
} tc_out[];
 | 
					} tc_out[];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
float getHeight(vec2 uv) {
 | 
					float getHeight(vec2 uv) {
 | 
				
			||||||
| 
						 | 
					@ -39,8 +40,8 @@ float calculateSlope() {
 | 
				
			||||||
    float hUp = getHeight(tc_in[gl_InvocationID].texCoord + vec2(0.0f, step));
 | 
					    float hUp = getHeight(tc_in[gl_InvocationID].texCoord + vec2(0.0f, step));
 | 
				
			||||||
    float hDown = getHeight(tc_in[gl_InvocationID].texCoord + vec2(0.0f, -step));
 | 
					    float hDown = getHeight(tc_in[gl_InvocationID].texCoord + vec2(0.0f, -step));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    float slopeX = abs(hLeft - hRight);
 | 
					    float slopeX = abs(hLeft - hRight) * displacementScale;
 | 
				
			||||||
    float slopeY = abs(hUp - hDown);
 | 
					    float slopeY = abs(hUp - hDown) * displacementScale;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    float maxSlope = max(slopeX, slopeY);
 | 
					    float maxSlope = max(slopeX, slopeY);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -54,6 +55,8 @@ void main() {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    float slope = calculateSlope();
 | 
					    float slope = calculateSlope();
 | 
				
			||||||
    float tessLevel = tessellationFactor * (1.0f + slope * 10.0f);
 | 
					    float tessLevel = tessellationFactor * (1.0f + slope * 10.0f);
 | 
				
			||||||
 | 
					    tessLevel = max(tessLevel, maxTessellation);
 | 
				
			||||||
 | 
					    tc_out[gl_InvocationID].tessLevel = tessLevel;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Set tessellation levels
 | 
					    // Set tessellation levels
 | 
				
			||||||
    if (gl_InvocationID == 0) {
 | 
					    if (gl_InvocationID == 0) {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -18,6 +18,7 @@ layout(std140, binding = 4) uniform GeoUniforms
 | 
				
			||||||
in TC_OUT {
 | 
					in TC_OUT {
 | 
				
			||||||
    vec3 position;
 | 
					    vec3 position;
 | 
				
			||||||
    vec2 texCoord;
 | 
					    vec2 texCoord;
 | 
				
			||||||
 | 
					    float tessLevel;
 | 
				
			||||||
} te_in[];
 | 
					} te_in[];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
out TE_OUT {
 | 
					out TE_OUT {
 | 
				
			||||||
| 
						 | 
					@ -30,19 +31,25 @@ float getHeight(vec2 uv) {
 | 
				
			||||||
    return texture(heightTexture, uv).r * displacementScale;
 | 
					    return texture(heightTexture, uv).r * displacementScale;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					float getNeighbor(float tessFactor) {
 | 
				
			||||||
 | 
					    return (float(gridDensity) * tessFactor + 1.0f);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
vec3 calculateSmoothNormal(vec3 pos, vec2 coord) {
 | 
					vec3 calculateSmoothNormal(vec3 pos, vec2 coord) {
 | 
				
			||||||
    // Currently hardcoded to match patch density
 | 
					    // Currently hardcoded to match patch density
 | 
				
			||||||
    float step = 1.0f / (float(gridDensity) * maxTessellation + 1.0f);
 | 
					    //float step = 1.0f / (float(gridDensity) * tessLevel + 1.0f);
 | 
				
			||||||
 | 
					    float stepU = 1.0f / (float(gridDensity) * gl_TessLevelInner[0]);
 | 
				
			||||||
 | 
					    float stepV = 1.0f / (float(gridDensity) * gl_TessLevelInner[1]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Find surrounding heights
 | 
					    // Find surrounding heights
 | 
				
			||||||
    float hLeft = getHeight(coord + vec2(-step, 0.0f));
 | 
					    float hLeft = getHeight(coord + vec2(-stepU, 0.0f));
 | 
				
			||||||
    float hRight = getHeight(coord + vec2(step, 0.0f));
 | 
					    float hRight = getHeight(coord + vec2(stepU, 0.0f));
 | 
				
			||||||
    float hUp = getHeight(coord + vec2(0.0f, step));
 | 
					    float hUp = getHeight(coord + vec2(0.0f, stepV));
 | 
				
			||||||
    float hDown = getHeight(coord + vec2(0.0f, -step));
 | 
					    float hDown = getHeight(coord + vec2(0.0f, -stepV));
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    // Calculate tangents
 | 
					    // Calculate tangents
 | 
				
			||||||
    vec3 tangentX = normalize(vec3(step, hRight - hLeft, 0.0));
 | 
					    vec3 tangentX = normalize(vec3(stepU, hRight - hLeft, 0.0));
 | 
				
			||||||
    vec3 tangentY = normalize(vec3(0.0, hUp - hDown, step));
 | 
					    vec3 tangentY = normalize(vec3(0.0, hUp - hDown, stepV));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return normalize(cross(tangentY, tangentX));
 | 
					    return normalize(cross(tangentY, tangentX));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue