Browse Source

Tessellation work

Panagiotis Christopoulos Charitos 12 years ago
parent
commit
80836733fd

+ 64 - 64
shaders/MsCommonTessc.glsl

@@ -9,52 +9,47 @@ in mediump vec3 vNormal[];
 #if PASS_COLOR
 #if PASS_COLOR
 in mediump vec4 vTangent[];
 in mediump vec4 vTangent[];
 #endif
 #endif
+#if INSTANCE_ID_FRAGMENT_SHADER
+uint vInstanceId[];
+#endif
+
+// Out
+struct CommonPatch
+{
+	vec3 positions[3];
+	vec2 texCoord[3];
+	vec3 normal[3];
+#if PASS_COLOR
+	vec4 tangent[3];
+#endif
+#if INSTANCE_ID_FRAGMENT_SHADER
+	uint instanceId;
+#endif
+};
 
 
 struct PNPatch
 struct PNPatch
 {
 {
-	vec3 pos030;
 	vec3 pos021;
 	vec3 pos021;
 	vec3 pos012;
 	vec3 pos012;
-	vec3 pos003;
 	vec3 pos102;
 	vec3 pos102;
 	vec3 pos201;
 	vec3 pos201;
-	vec3 pos300;
 	vec3 pos210;
 	vec3 pos210;
 	vec3 pos120;
 	vec3 pos120;
 	vec3 pos111;
 	vec3 pos111;
-
-	vec2 texCoord[3];
-	vec3 normal[3];
-#if PASS_COLOR
-	vec4 tangent[3];
-#endif
 };
 };
 
 
+#define pos030 positions[0]
+#define pos003 positions[1]
+#define pos300 positions[2]
+
 struct PhongPatch
 struct PhongPatch
 {
 {
 	vec3 terms[3];
 	vec3 terms[3];
-
-	vec3 positions[3];
-	vec2 texCoord[3];
-	vec3 normal[3];
-#if PASS_COLOR
-	vec4 tangent[3];
-#endif
-};
-
-struct DispMapPatch
-{
-	vec3 positions[3];
-	vec2 texCoord[3];
-	vec3 normal[3];
-#if PASS_COLOR
-	vec4 tangent[3];
-#endif
 };
 };
 
 
 out patch PNPatch pnPatch;
 out patch PNPatch pnPatch;
 out patch PhongPatch phongPatch;
 out patch PhongPatch phongPatch;
-out patch DispMapPatch dispPatch;
+out patch CommonPatch commonPatch;
 
 
 // Project point to plane
 // Project point to plane
 vec3 projectToPlane(vec3 point, vec3 planePoint, vec3 planeNormal)
 vec3 projectToPlane(vec3 point, vec3 planePoint, vec3 planeNormal)
@@ -69,38 +64,39 @@ vec3 projectToPlane(vec3 point, vec3 planePoint, vec3 planeNormal)
 void calcPositions()
 void calcPositions()
 {
 {
 	// The original vertices stay the same
 	// The original vertices stay the same
-	pnPatch.pos030 = vPosition[0];
-	pnPatch.pos003 = vPosition[1];
-	pnPatch.pos300 = vPosition[2];
+	commonPatch.pos030 = vPosition[0];
+	commonPatch.pos003 = vPosition[1];
+	commonPatch.pos300 = vPosition[2];
 
 
 	// edges are names according to the opposing vertex
 	// edges are names according to the opposing vertex
-	vec3 edgeB300 = pnPatch.pos003 - pnPatch.pos030;
-	vec3 edgeB030 = pnPatch.pos300 - pnPatch.pos003;
-	vec3 edgeB003 = pnPatch.pos030 - pnPatch.pos300;
+	vec3 edgeB300 = commonPatch.pos003 - commonPatch.pos030;
+	vec3 edgeB030 = commonPatch.pos300 - commonPatch.pos003;
+	vec3 edgeB003 = commonPatch.pos030 - commonPatch.pos300;
 
 
 	// Generate two midpoints on each edge
 	// Generate two midpoints on each edge
-	pnPatch.pos021 = pnPatch.pos030 + edgeB300 / 3.0;
-	pnPatch.pos012 = pnPatch.pos030 + edgeB300 * 2.0 / 3.0;
-	pnPatch.pos102 = pnPatch.pos003 + edgeB030 / 3.0;
-	pnPatch.pos201 = pnPatch.pos003 + edgeB030 * 2.0 / 3.0;
-	pnPatch.pos210 = pnPatch.pos300 + edgeB003 / 3.0;
-	pnPatch.pos120 = pnPatch.pos300 + edgeB003 * 2.0 / 3.0;
-
-	pnPatch.pos021 = 
-		projectToPlane(pnPatch.pos021, pnPatch.pos030, pnPatch.normal[0]);
-	pnPatch.pos012 =
-		projectToPlane(pnPatch.pos012, pnPatch.pos003, pnPatch.normal[1]);
-	pnPatch.pos102 = 
-		projectToPlane(pnPatch.pos102, pnPatch.pos003, pnPatch.normal[1]);
-	pnPatch.pos201 = 
-		projectToPlane(pnPatch.pos201, pnPatch.pos300, pnPatch.normal[2]);
-	pnPatch.pos210 = 
-		projectToPlane(pnPatch.pos210, pnPatch.pos300, pnPatch.normal[2]);
-	pnPatch.pos120 = 
-		projectToPlane(pnPatch.pos120, pnPatch.pos030, pnPatch.normal[0]);
+	pnPatch.pos021 = commonPatch.pos030 + edgeB300 / 3.0;
+	pnPatch.pos012 = commonPatch.pos030 + edgeB300 * 2.0 / 3.0;
+	pnPatch.pos102 = commonPatch.pos003 + edgeB030 / 3.0;
+	pnPatch.pos201 = commonPatch.pos003 + edgeB030 * 2.0 / 3.0;
+	pnPatch.pos210 = commonPatch.pos300 + edgeB003 / 3.0;
+	pnPatch.pos120 = commonPatch.pos300 + edgeB003 * 2.0 / 3.0;
+
+	pnPatch.pos021 = projectToPlane(
+		pnPatch.pos021, commonPatch.pos030, commonPatch.normal[0]);
+	pnPatch.pos012 = projectToPlane(
+		pnPatch.pos012, commonPatch.pos003, commonPatch.normal[1]);
+	pnPatch.pos102 = projectToPlane(
+		pnPatch.pos102, commonPatch.pos003, commonPatch.normal[1]);
+	pnPatch.pos201 = projectToPlane(
+		pnPatch.pos201, commonPatch.pos300, commonPatch.normal[2]);
+	pnPatch.pos210 = projectToPlane(
+		pnPatch.pos210, commonPatch.pos300, commonPatch.normal[2]);
+	pnPatch.pos120 = projectToPlane(
+		pnPatch.pos120, commonPatch.pos030, commonPatch.normal[0]);
 
 
 	// Handle the center
 	// Handle the center
-	vec3 center = (pnPatch.pos003 + pnPatch.pos030 + pnPatch.pos300) / 3.0;
+	vec3 center = (commonPatch.pos003 + commonPatch.pos030 
+		+ commonPatch.pos300) / 3.0;
 	pnPatch.pos111 = (pnPatch.pos021 + pnPatch.pos012 + pnPatch.pos102 +
 	pnPatch.pos111 = (pnPatch.pos021 + pnPatch.pos012 + pnPatch.pos102 +
 		pnPatch.pos201 + pnPatch.pos210 + pnPatch.pos120) / 6.0;
 		pnPatch.pos201 + pnPatch.pos210 + pnPatch.pos120) / 6.0;
 	pnPatch.pos111 += (pnPatch.pos111 - center) / 2.0;
 	pnPatch.pos111 += (pnPatch.pos111 - center) / 2.0;
@@ -168,10 +164,10 @@ void tessellatePNPositionNormalTangentTexCoord(
 
 
 		for(int i = 0 ; i < 3 ; i++) 
 		for(int i = 0 ; i < 3 ; i++) 
 		{		
 		{		
-			pnPatch.texCoord[i] = vTexCoords[i];
-			pnPatch.normal[i] = vNormal[i];
+			commonPatch.texCoord[i] = vTexCoords[i];
+			commonPatch.normal[i] = vNormal[i];
 #if PASS_COLOR
 #if PASS_COLOR
-			pnPatch.tangent[i] = vTangent[i];
+			commonPatch.tangent[i] = vTangent[i];
 #endif
 #endif
 		}
 		}
 
 
@@ -216,11 +212,11 @@ void tessellatePhongPositionNormalTangentTexCoord(
 
 
 		for(int i = 0 ; i < 3 ; i++) 
 		for(int i = 0 ; i < 3 ; i++) 
 		{
 		{
-			phongPatch.positions[i] = vPosition[i];
-			phongPatch.texCoord[i] = vTexCoords[i];
-			phongPatch.normal[i] = vNormal[i];
+			commonPatch.positions[i] = vPosition[i];
+			commonPatch.texCoord[i] = vTexCoords[i];
+			commonPatch.normal[i] = vNormal[i];
 #if PASS_COLOR
 #if PASS_COLOR
-			phongPatch.tangent[i] = vTangent[i];
+			commonPatch.tangent[i] = vTangent[i];
 #endif
 #endif
 
 
 			phongPatch.terms[i][0] = 
 			phongPatch.terms[i][0] = 
@@ -261,14 +257,18 @@ void tessellateDispMapPositionNormalTangentTexCoord(
 {
 {
 	for(int i = 0 ; i < 3 ; i++) 
 	for(int i = 0 ; i < 3 ; i++) 
 	{
 	{
-		phongPatch.positions[i] = vPosition[i];
-		phongPatch.texCoord[i] = vTexCoords[i];
-		phongPatch.normal[i] = vNormal[i];
+		commonPatch.positions[i] = vPosition[i];
+		commonPatch.texCoord[i] = vTexCoords[i];
+		commonPatch.normal[i] = vNormal[i];
 #if PASS_COLOR
 #if PASS_COLOR
-		phongPatch.tangent[i] = vTangent[i];
+		commonPatch.tangent[i] = vTangent[i];
 #endif
 #endif
 	}
 	}
 
 
+#if INSTANCE_ID_FRAGMENT_SHADER
+	commonPatch.instanceId = vInstanceId[0];
+#endif
+
 	gl_TessLevelOuter[0] = maxTessLevel;
 	gl_TessLevelOuter[0] = maxTessLevel;
 	gl_TessLevelOuter[1] = maxTessLevel;
 	gl_TessLevelOuter[1] = maxTessLevel;
 	gl_TessLevelOuter[2] = maxTessLevel;
 	gl_TessLevelOuter[2] = maxTessLevel;

+ 23 - 35
shaders/MsCommonTesse.glsl

@@ -2,37 +2,25 @@ layout(triangles, equal_spacing, ccw) in;
 
 
 struct PNPatch
 struct PNPatch
 {
 {
-	vec3 pos030;
 	vec3 pos021;
 	vec3 pos021;
 	vec3 pos012;
 	vec3 pos012;
-	vec3 pos003;
 	vec3 pos102;
 	vec3 pos102;
 	vec3 pos201;
 	vec3 pos201;
-	vec3 pos300;
 	vec3 pos210;
 	vec3 pos210;
 	vec3 pos120;
 	vec3 pos120;
 	vec3 pos111;
 	vec3 pos111;
-
-	vec2 texCoord[3];
-	vec3 normal[3];
-#if PASS_COLOR
-	vec4 tangent[3];
-#endif
 };
 };
 
 
+#define pos030 positions[0]
+#define pos003 positions[1]
+#define pos300 positions[2]
+
 struct PhongPatch
 struct PhongPatch
 {
 {
 	vec3 terms[3];
 	vec3 terms[3];
-
-	vec3 positions[3];
-	vec2 texCoord[3];
-	vec3 normal[3];
-#if PASS_COLOR
-	vec4 tangent[3];
-#endif
 };
 };
 
 
-struct DispMapPatch
+struct CommonPatch
 {
 {
 	vec3 positions[3];
 	vec3 positions[3];
 	vec2 texCoord[3];
 	vec2 texCoord[3];
@@ -44,7 +32,7 @@ struct DispMapPatch
 
 
 in patch PNPatch pnPatch;
 in patch PNPatch pnPatch;
 in patch PhongPatch phongPatch;
 in patch PhongPatch phongPatch;
-in patch DispMapPatch dispPatch;
+in patch CommonPatch commonPatch;
 
 
 // Varyings out
 // Varyings out
 out highp vec2 teTexCoords;
 out highp vec2 teTexCoords;
@@ -60,12 +48,12 @@ out mediump vec4 teTangent;
 void tessellatePNPositionNormalTangentTexCoord(in mat4 mvp, in mat3 normalMat)
 void tessellatePNPositionNormalTangentTexCoord(in mat4 mvp, in mat3 normalMat)
 {
 {
 #if PASS_COLOR
 #if PASS_COLOR
-	teNormal = normalize(normalMat * INTERPOLATE(pnPatch.normal));
-	teTangent = INTERPOLATE(pnPatch.tangent);
+	teNormal = normalize(normalMat * INTERPOLATE(commonPatch.normal));
+	teTangent = INTERPOLATE(commonPatch.tangent);
 	teTangent.xyz = normalize(normalMat * teTangent.xyz);
 	teTangent.xyz = normalize(normalMat * teTangent.xyz);
 #endif
 #endif
 
 
-	teTexCoords = INTERPOLATE(pnPatch.texCoord);
+	teTexCoords = INTERPOLATE(commonPatch.texCoord);
 
 
 	float u = gl_TessCoord.x;
 	float u = gl_TessCoord.x;
 	float v = gl_TessCoord.y;
 	float v = gl_TessCoord.y;
@@ -79,9 +67,9 @@ void tessellatePNPositionNormalTangentTexCoord(in mat4 mvp, in mat3 normalMat)
 	float wPow2 = pow(w, 2);
 	float wPow2 = pow(w, 2);
 
 
 	vec3 pos = 
 	vec3 pos = 
-		pnPatch.pos300 * wPow3
-		+ pnPatch.pos030 * uPow3
-		+ pnPatch.pos003 * vPow3
+		commonPatch.pos300 * wPow3
+		+ commonPatch.pos030 * uPow3
+		+ commonPatch.pos003 * vPow3
 		+ pnPatch.pos210 * 3.0 * wPow2 * u 
 		+ pnPatch.pos210 * 3.0 * wPow2 * u 
 		+ pnPatch.pos120 * 3.0 * w * uPow2 
 		+ pnPatch.pos120 * 3.0 * w * uPow2 
 		+ pnPatch.pos201 * 3.0 * wPow2 * v 
 		+ pnPatch.pos201 * 3.0 * wPow2 * v 
@@ -98,15 +86,15 @@ void tessellatePhongPositionNormalTangentTexCoord(
 	in mat4 mvp, in mat3 normalMat)
 	in mat4 mvp, in mat3 normalMat)
 {
 {
 #if PASS_COLOR
 #if PASS_COLOR
-	teNormal = normalize(normalMat * INTERPOLATE(phongPatch.normal));
-	teTangent = INTERPOLATE(phongPatch.tangent);
+	teNormal = normalize(normalMat * INTERPOLATE(commonPatch.normal));
+	teTangent = INTERPOLATE(commonPatch.tangent);
 	teTangent.xyz = normalize(normalMat * teTangent.xyz);
 	teTangent.xyz = normalize(normalMat * teTangent.xyz);
 #endif
 #endif
 
 
-	teTexCoords = INTERPOLATE(phongPatch.texCoord);
+	teTexCoords = INTERPOLATE(commonPatch.texCoord);
 
 
 	// interpolated position
 	// interpolated position
-	vec3 barPos = INTERPOLATE(phongPatch.positions);
+	vec3 barPos = INTERPOLATE(commonPatch.positions);
 
 
 	// build terms
 	// build terms
 	vec3 termIJ = vec3(
 	vec3 termIJ = vec3(
@@ -126,9 +114,9 @@ void tessellatePhongPositionNormalTangentTexCoord(
 
 
 	// phong tesselated pos
 	// phong tesselated pos
 	vec3 phongPos = 
 	vec3 phongPos = 
-		tc2[0] * phongPatch.positions[0]
-		 + tc2[1] * phongPatch.positions[1]
-		 + tc2[2] * phongPatch.positions[2]
+		tc2[0] * commonPatch.positions[0]
+		 + tc2[1] * commonPatch.positions[1]
+		 + tc2[2] * commonPatch.positions[2]
 		 + gl_TessCoord[0] * gl_TessCoord[1] * termIJ
 		 + gl_TessCoord[0] * gl_TessCoord[1] * termIJ
 		 + gl_TessCoord[1] * gl_TessCoord[2] * termJK
 		 + gl_TessCoord[1] * gl_TessCoord[2] * termJK
 		 + gl_TessCoord[2] * gl_TessCoord[0] * termIK;
 		 + gl_TessCoord[2] * gl_TessCoord[0] * termIK;
@@ -142,19 +130,19 @@ void tessellatePhongPositionNormalTangentTexCoord(
 void tessellateDispMapPositionNormalTangentTexCoord(
 void tessellateDispMapPositionNormalTangentTexCoord(
 	in mat4 mvp, in mat3 normalMat, in sampler2D dispMap)
 	in mat4 mvp, in mat3 normalMat, in sampler2D dispMap)
 {
 {
-	vec3 norm = INTERPOLATE(dispPatch.normal);
+	vec3 norm = INTERPOLATE(commonPatch.normal);
 #if PASS_COLOR
 #if PASS_COLOR
 	teNormal = normalize(normalMat * norm);
 	teNormal = normalize(normalMat * norm);
-	teTangent = INTERPOLATE(dispPatch.tangent);
+	teTangent = INTERPOLATE(commonPatch.tangent);
 	teTangent.xyz = normalize(normalMat * teTangent.xyz);
 	teTangent.xyz = normalize(normalMat * teTangent.xyz);
 #endif
 #endif
 
 
-	teTexCoords = INTERPOLATE(dispPatch.texCoord);
+	teTexCoords = INTERPOLATE(commonPatch.texCoord);
 
 
 	float height = texture(dispMap, teTexCoords).r;
 	float height = texture(dispMap, teTexCoords).r;
 	height *= 0.1;
 	height *= 0.1;
 
 
-	vec3 pos = INTERPOLATE(dispPatch.positions) + norm * height;
+	vec3 pos = INTERPOLATE(commonPatch.positions) + norm * height;
 	gl_Position = mvp * vec4(pos, 1.0);
 	gl_Position = mvp * vec4(pos, 1.0);
 }
 }
 
 

+ 0 - 5
src/resource/Material.cpp

@@ -285,11 +285,6 @@ void Material::parseMaterialTag(const XmlElement& materialEl)
 
 
 			std::stringstream src;
 			std::stringstream src;
 
 
-			src << "#define INSTANCING " << (U)mspc.usesInstancing() << "\n";
-			src << "#define INSTANCE_ID_FRAGMENT_SHADER " 
-				<< (U)mspc.usesInstanceIdInFragmentShader() << "\n";
-			src << "#define TESSELLATION " << (U)tessellation << "\n";
-
 			src << "#define LOD " << level << "\n";
 			src << "#define LOD " << level << "\n";
 
 
 			for(U i = 0; i < PASS_COUNT; i++)
 			for(U i = 0; i < PASS_COUNT; i++)

+ 7 - 1
src/resource/MaterialShaderProgramCreator.cpp

@@ -77,7 +77,13 @@ void MaterialShaderProgramCreator::parseShaderProgramTag(
 	}
 	}
 
 
 	// Write all
 	// Write all
-	source  = srcLines.join("\n");
+	std::stringstream defines;
+	defines << "#define INSTANCING " << (U)instanced << "\n";
+	defines << "#define INSTANCE_ID_FRAGMENT_SHADER " 
+		<< (U)instanceIdInFragmentShader << "\n";
+	defines << "#define TESSELLATION " << (U)tessellation << "\n";
+
+	source  = defines.str() + srcLines.join("\n");
 }
 }
 
 
 //==============================================================================
 //==============================================================================