MsCommonTesse.glsl 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. // Copyright (C) 2009-2016, Panagiotis Christopoulos Charitos.
  2. // All rights reserved.
  3. // Code licensed under the BSD License.
  4. // http://www.anki3d.org/LICENSE
  5. layout(triangles, equal_spacing, ccw) in;
  6. #define IN_POS4(i_) gl_in[i_].gl_Position
  7. #define IN_POS3(i_) gl_in[i_].gl_Position.xyz
  8. //
  9. // Input
  10. //
  11. struct PNPatch
  12. {
  13. vec3 pos021;
  14. vec3 pos012;
  15. vec3 pos102;
  16. vec3 pos201;
  17. vec3 pos210;
  18. vec3 pos120;
  19. vec3 pos111;
  20. };
  21. struct PhongPatch
  22. {
  23. vec3 terms[3];
  24. };
  25. #if INSTANCE_ID_FRAGMENT_SHADER
  26. struct CommonPatch
  27. {
  28. uint instanceId;
  29. };
  30. #endif
  31. in gl_PerVertex
  32. {
  33. vec4 gl_Position;
  34. } gl_in[];
  35. in patch PNPatch pnPatch;
  36. in patch PhongPatch phongPatch;
  37. #if INSTANCE_ID_FRAGMENT_SHADER
  38. in patch CommonPatch commonPatch;
  39. #endif
  40. layout(location = 0) in vec2 inTexCoord[];
  41. layout(location = 1) in vec3 inNormal[];
  42. #if PASS == COLOR
  43. layout(location = 2) in vec4 inTangent[];
  44. #endif
  45. //
  46. // Output
  47. //
  48. out gl_PerVertex
  49. {
  50. vec4 gl_Position;
  51. };
  52. layout(location = 0) out highp vec2 outTexCoord;
  53. #if PASS == COLOR
  54. layout(location = 1) out mediump vec3 outNormal;
  55. layout(location = 2) out mediump vec4 outTangent;
  56. #endif
  57. #define INTERPOLATE(x_) (x_[0] * gl_TessCoord.x + x_[1] * gl_TessCoord.y + x_[2] * gl_TessCoord.z)
  58. // Smooth tessellation
  59. #define tessellatePNPositionNormalTangentTexCoord_DEFINED
  60. void tessellatePNPositionNormalTangentTexCoord(in mat4 mvp, in mat3 normalMat)
  61. {
  62. #if PASS == COLOR
  63. outNormal = normalize(normalMat * INTERPOLATE(inNormal));
  64. outTangent = INTERPOLATE(inTangent);
  65. outTangent.xyz = normalize(normalMat * outTangent.xyz);
  66. #endif
  67. outTexCoord = INTERPOLATE(inTexCoord);
  68. float u = gl_TessCoord.x;
  69. float v = gl_TessCoord.y;
  70. float w = gl_TessCoord.z;
  71. float uPow3 = pow(u, 3);
  72. float vPow3 = pow(v, 3);
  73. float wPow3 = pow(w, 3);
  74. float uPow2 = pow(u, 2);
  75. float vPow2 = pow(v, 2);
  76. float wPow2 = pow(w, 2);
  77. vec3 pos030 = IN_POS3(0);
  78. vec3 pos003 = IN_POS3(1);
  79. vec3 pos300 = IN_POS3(2);
  80. vec3 pos =
  81. pos300 * wPow3
  82. + pos030 * uPow3
  83. + pos003 * vPow3
  84. + pnPatch.pos210 * 3.0 * wPow2 * u
  85. + pnPatch.pos120 * 3.0 * w * uPow2
  86. + pnPatch.pos201 * 3.0 * wPow2 * v
  87. + pnPatch.pos021 * 3.0 * uPow2 * v
  88. + pnPatch.pos102 * 3.0 * w * vPow2
  89. + pnPatch.pos012 * 3.0 * u * vPow2
  90. + pnPatch.pos111 * 6.0 * w * u * v;
  91. gl_Position = mvp * vec4(pos, 1.0);
  92. }
  93. #define tessellatePhongPositionNormalTangentTexCoord_DEFINED
  94. void tessellatePhongPositionNormalTangentTexCoord(
  95. in mat4 mvp, in mat3 normalMat)
  96. {
  97. #if PASS == COLOR
  98. outNormal = normalize(normalMat * INTERPOLATE(inNormal));
  99. outTangent = INTERPOLATE(inTangent);
  100. outTangent.xyz = normalize(normalMat * outTangent.xyz);
  101. #endif
  102. outTexCoord = INTERPOLATE(inTexCoord);
  103. // interpolated position
  104. vec3 inpos[3] = vec3[](IN_POS3(0), IN_POS3(1), IN_POS3(2));
  105. vec3 barPos = INTERPOLATE(inpos);
  106. // build terms
  107. vec3 termIJ = vec3(
  108. phongPatch.terms[0][0],
  109. phongPatch.terms[1][0],
  110. phongPatch.terms[2][0]);
  111. vec3 termJK = vec3(
  112. phongPatch.terms[0][1],
  113. phongPatch.terms[1][1],
  114. phongPatch.terms[2][1]);
  115. vec3 termIK = vec3(
  116. phongPatch.terms[0][2],
  117. phongPatch.terms[1][2],
  118. phongPatch.terms[2][2]);
  119. vec3 tc2 = gl_TessCoord * gl_TessCoord;
  120. // phong tesselated pos
  121. vec3 phongPos =
  122. tc2[0] * inpos[0]
  123. + tc2[1] * inpos[1]
  124. + tc2[2] * inpos[2]
  125. + gl_TessCoord[0] * gl_TessCoord[1] * termIJ
  126. + gl_TessCoord[1] * gl_TessCoord[2] * termJK
  127. + gl_TessCoord[2] * gl_TessCoord[0] * termIK;
  128. float tessAlpha = 1.0;
  129. vec3 finalPos = (1.0 - tessAlpha) * barPos + tessAlpha * phongPos;
  130. gl_Position = mvp * vec4(finalPos, 1.0);
  131. }
  132. #define tessellateDispMapPositionNormalTangentTexCoord_DEFINED
  133. void tessellateDispMapPositionNormalTangentTexCoord(
  134. in mat4 mvp, in mat3 normalMat, in sampler2D dispMap)
  135. {
  136. vec3 norm = INTERPOLATE(inNormal);
  137. #if PASS == COLOR
  138. outNormal = normalize(normalMat * norm);
  139. outTangent = INTERPOLATE(inTangent);
  140. outTangent.xyz = normalize(normalMat * outTangent.xyz);
  141. #endif
  142. outTexCoord = INTERPOLATE(inTexCoord);
  143. float height = texture(dispMap, outTexCoord).r;
  144. height = height * 0.7 - 0.35;
  145. vec3 inpos[3] = vec3[](IN_POS3(0), IN_POS3(1), IN_POS3(2));
  146. vec3 pos = INTERPOLATE(inpos) + norm * height;
  147. gl_Position = mvp * vec4(pos, 1.0);
  148. }