2
0
Эх сурвалжийг харах

Tessellation without cracks

Panagiotis Christopoulos Charitos 12 жил өмнө
parent
commit
18dc07c59d

+ 1 - 1
include/anki/renderer/Ms.h

@@ -20,7 +20,7 @@ public:
 
 	/// @name Accessors
 	/// @{
-	const Texture& getFai0() const
+	Texture& getFai0()
 	{
 		return fai0[1];
 	}

+ 8 - 4
shaders/BsCommonFrag.glsl

@@ -5,10 +5,8 @@
 #pragma anki include "shaders/MsBsCommon.glsl"
 #pragma anki include "shaders/LinearDepth.glsl"
 
-#define vTexCoord_DEFINED
-in highp vec2 vTexCoord;
-#define vInstanceId_DEFINED
-flat in highp int vInstanceId;
+in vec2 vTexCoord;
+flat in float vAlpha;
 
 #if defined(PASS_COLOR)
 layout(location = 0) out vec4 fColor;
@@ -19,6 +17,12 @@ layout(location = 0) out vec4 fColor;
 #	define texture_DEFINED
 #endif
 
+#define getAlpha_DEFINED
+float getAlpha()
+{
+	return vAlpha;
+}
+
 #if defined(PASS_COLOR)
 #	define writeFais_DEFINED
 void writeFais(in vec4 color)

+ 9 - 2
shaders/BsCommonVert.glsl

@@ -1,5 +1,6 @@
 // Common code for all vertex shaders of BS
 
+#define DEFAULT_FLOAT_PRECISION mediump
 #pragma anki include "shaders/MsBsCommon.glsl"
 
 layout(location = 0) in vec3 position;
@@ -8,7 +9,7 @@ layout(location = 3) in vec2 texCoord;
 /// @name Varyings
 /// @{
 out vec2 vTexCoord;
-flat out int vInstanceId;
+out flat float vAlpha;
 /// @}
 
 //==============================================================================
@@ -38,5 +39,11 @@ void particle(in mat4 mvp)
 {
 	vTexCoord = texCoord;
 	gl_Position = mvp * vec4(position, 1);
-	vInstanceId = gl_InstanceID;
+}
+
+//==============================================================================
+#define writeAlpha_DEFINED
+void writeAlpha(in float alpha)
+{
+	vAlpha = alpha;
 }

+ 13 - 10
shaders/MsCommonTessc.glsl

@@ -10,7 +10,7 @@ in mediump vec3 vNormal[];
 in mediump vec4 vTangent[];
 #endif
 #if INSTANCE_ID_FRAGMENT_SHADER
-uint vInstanceId[];
+flat in uint vInstanceId[];
 #endif
 
 // Out
@@ -107,17 +107,18 @@ vec3 calcFaceNormal(in vec3 v0, in vec3 v1, in vec3 v2)
 	return normalize(cross(v1 - v0, v2 - v0));
 }
 
-/*float calcEdgeTessLevel(in vec3 n0, in vec3 n1, in float maxTessLevel)
+float calcEdgeTessLevel(in vec3 n0, in vec3 n1, in float maxTessLevel)
 {
 	vec3 norm = normalize(n0 + n1);
-	return (1.0 - norm.z) * (maxTessLevel - 1.0) + 1.0;
-}*/
+	float tess = (1.0 - norm.z) * (maxTessLevel - 1.0) + 1.0;
+	return tess;
+}
 
-float calcEdgeTessLevel(in vec2 p0, in vec2 p1, in float maxTessLevel)
+/*float calcEdgeTessLevel(in vec2 p0, in vec2 p1, in float maxTessLevel)
 {
 	float dist = distance(p0, p1) * 10.0;
 	return dist * (maxTessLevel - 1.0) + 1.0;
-}
+}*/
 
 // Given the face positions in NDC caclulate if the face is front facing or not
 bool isFaceFrontFacing(in vec2 posNdc[3])
@@ -234,10 +235,12 @@ void tessellatePhongPositionNormalTangentTexCoord(
 			nv[i] = normalMat * vNormal[i];
 		}
 
-		gl_TessLevelOuter[0] = maxTessLevel;
-		gl_TessLevelOuter[1] = maxTessLevel;
-		gl_TessLevelOuter[2] = maxTessLevel;
-		gl_TessLevelInner[0] = maxTessLevel;
+		gl_TessLevelOuter[0] = calcEdgeTessLevel(nv[1], nv[2], maxTessLevel);
+		gl_TessLevelOuter[1] = calcEdgeTessLevel(nv[2], nv[0], maxTessLevel);
+		gl_TessLevelOuter[2] = calcEdgeTessLevel(nv[0], nv[1], maxTessLevel);
+		gl_TessLevelInner[0] = 1.0;
+		gl_TessLevelInner[0] = (gl_TessLevelOuter[0] + gl_TessLevelOuter[1]
+			+ gl_TessLevelOuter[2]) / 3.0;
 	}
 	else
 	{

+ 4 - 1
shaders/MsCommonTesse.glsl

@@ -28,6 +28,9 @@ struct CommonPatch
 #if PASS_COLOR
 	vec4 tangent[3];
 #endif
+#if INSTANCE_ID_FRAGMENT_SHADER
+	uint instanceId;
+#endif
 };
 
 in patch PNPatch pnPatch;
@@ -140,7 +143,7 @@ void tessellateDispMapPositionNormalTangentTexCoord(
 	teTexCoords = INTERPOLATE(commonPatch.texCoord);
 
 	float height = texture(dispMap, teTexCoords).r;
-	height *= 0.1;
+	height *= 1.0;
 
 	vec3 pos = INTERPOLATE(commonPatch.positions) + norm * height;
 	gl_Position = mvp * vec4(pos, 1.0);

+ 2 - 2
src/gl/ShaderProgram.cpp

@@ -551,10 +551,10 @@ GLuint ShaderProgram::createAndCompileShader(const char* sourceCode,
 			break;
 #	if ANKI_GL == ANKI_GL_DESKTOP
 		case GL_TESS_EVALUATION_SHADER:
-			ext = ".te";
+			ext = ".tesse";
 			break;
 		case GL_TESS_CONTROL_SHADER:
-			ext = ".tc";
+			ext = ".tessc";
 			break;
 		case GL_GEOMETRY_SHADER:
 			ext = ".geom";

+ 12 - 0
src/resource/MaterialShaderProgramCreator.cpp

@@ -376,6 +376,18 @@ void MaterialShaderProgramCreator::parseOperationTag(
 					argsList.push_back(std::string(argEl.getText()) 
 						+ "[gl_InstanceID]");
 				}
+				else if(shader == TESSC)
+				{
+					argsList.push_back(std::string(argEl.getText()) 
+						+ "[vInstanceId[0]]");
+					instanceIdInFragmentShader = true;
+				}
+				else if(shader == TESSE)
+				{
+					argsList.push_back(std::string(argEl.getText()) 
+						+ "[commonPatch.instanceId]");
+					instanceIdInFragmentShader = true;
+				}
 				else if(shader == FRAGMENT)
 				{
 					argsList.push_back(std::string(argEl.getText())