MsCommonTesse.glsl 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. layout(triangles, equal_spacing, ccw) in;
  2. struct PNPatch
  3. {
  4. vec3 pos021;
  5. vec3 pos012;
  6. vec3 pos102;
  7. vec3 pos201;
  8. vec3 pos210;
  9. vec3 pos120;
  10. vec3 pos111;
  11. };
  12. #define pos030 tcPosition[0]
  13. #define pos003 tcPosition[1]
  14. #define pos300 tcPosition[2]
  15. struct PhongPatch
  16. {
  17. vec3 terms[3];
  18. };
  19. #if INSTANCE_ID_FRAGMENT_SHADER
  20. struct CommonPatch
  21. {
  22. uint instanceId;
  23. };
  24. #endif
  25. in patch PNPatch pnPatch;
  26. in patch PhongPatch phongPatch;
  27. #if INSTANCE_ID_FRAGMENT_SHADER
  28. in patch CommonPatch commonPatch;
  29. #endif
  30. in vec3 tcPosition[];
  31. in vec2 tcTexCoord[];
  32. in vec3 tcNormal[];
  33. #if PASS_COLOR
  34. in vec4 tcTangent[];
  35. #endif
  36. // Varyings out
  37. out highp vec2 teTexCoords;
  38. #if PASS_COLOR
  39. out mediump vec3 teNormal;
  40. out mediump vec4 teTangent;
  41. #endif
  42. #define INTERPOLATE(x_) (x_[0] * gl_TessCoord.x + x_[1] * gl_TessCoord.y + x_[2] * gl_TessCoord.z)
  43. // Smooth tessellation
  44. #define tessellatePNPositionNormalTangentTexCoord_DEFINED
  45. void tessellatePNPositionNormalTangentTexCoord(in mat4 mvp, in mat3 normalMat)
  46. {
  47. #if PASS_COLOR
  48. teNormal = normalize(normalMat * INTERPOLATE(tcNormal));
  49. teTangent = INTERPOLATE(tcTangent);
  50. teTangent.xyz = normalize(normalMat * teTangent.xyz);
  51. #endif
  52. teTexCoords = INTERPOLATE(tcTexCoord);
  53. float u = gl_TessCoord.x;
  54. float v = gl_TessCoord.y;
  55. float w = gl_TessCoord.z;
  56. float uPow3 = pow(u, 3);
  57. float vPow3 = pow(v, 3);
  58. float wPow3 = pow(w, 3);
  59. float uPow2 = pow(u, 2);
  60. float vPow2 = pow(v, 2);
  61. float wPow2 = pow(w, 2);
  62. vec3 pos =
  63. pos300 * wPow3
  64. + pos030 * uPow3
  65. + pos003 * vPow3
  66. + pnPatch.pos210 * 3.0 * wPow2 * u
  67. + pnPatch.pos120 * 3.0 * w * uPow2
  68. + pnPatch.pos201 * 3.0 * wPow2 * v
  69. + pnPatch.pos021 * 3.0 * uPow2 * v
  70. + pnPatch.pos102 * 3.0 * w * vPow2
  71. + pnPatch.pos012 * 3.0 * u * vPow2
  72. + pnPatch.pos111 * 6.0 * w * u * v;
  73. gl_Position = mvp * vec4(pos, 1.0);
  74. }
  75. #define tessellatePhongPositionNormalTangentTexCoord_DEFINED
  76. void tessellatePhongPositionNormalTangentTexCoord(
  77. in mat4 mvp, in mat3 normalMat)
  78. {
  79. #if PASS_COLOR
  80. teNormal = normalize(normalMat * INTERPOLATE(tcNormal));
  81. teTangent = INTERPOLATE(tcTangent);
  82. teTangent.xyz = normalize(normalMat * teTangent.xyz);
  83. #endif
  84. teTexCoords = INTERPOLATE(tcTexCoord);
  85. // interpolated position
  86. vec3 barPos = INTERPOLATE(tcPosition);
  87. // build terms
  88. vec3 termIJ = vec3(
  89. phongPatch.terms[0][0],
  90. phongPatch.terms[1][0],
  91. phongPatch.terms[2][0]);
  92. vec3 termJK = vec3(
  93. phongPatch.terms[0][1],
  94. phongPatch.terms[1][1],
  95. phongPatch.terms[2][1]);
  96. vec3 termIK = vec3(
  97. phongPatch.terms[0][2],
  98. phongPatch.terms[1][2],
  99. phongPatch.terms[2][2]);
  100. vec3 tc2 = gl_TessCoord * gl_TessCoord;
  101. // phong tesselated pos
  102. vec3 phongPos =
  103. tc2[0] * tcPosition[0]
  104. + tc2[1] * tcPosition[1]
  105. + tc2[2] * tcPosition[2]
  106. + gl_TessCoord[0] * gl_TessCoord[1] * termIJ
  107. + gl_TessCoord[1] * gl_TessCoord[2] * termJK
  108. + gl_TessCoord[2] * gl_TessCoord[0] * termIK;
  109. float uTessAlpha = 1.0;
  110. vec3 finalPos = (1.0 - uTessAlpha) * barPos + uTessAlpha * phongPos;
  111. gl_Position = mvp * vec4(finalPos, 1.0);
  112. }
  113. #define tessellateDispMapPositionNormalTangentTexCoord_DEFINED
  114. void tessellateDispMapPositionNormalTangentTexCoord(
  115. in mat4 mvp, in mat3 normalMat, in sampler2D dispMap)
  116. {
  117. vec3 norm = INTERPOLATE(tcNormal);
  118. #if PASS_COLOR
  119. teNormal = normalize(normalMat * norm);
  120. teTangent = INTERPOLATE(tcTangent);
  121. teTangent.xyz = normalize(normalMat * teTangent.xyz);
  122. #endif
  123. teTexCoords = INTERPOLATE(tcTexCoord);
  124. float height = texture(dispMap, teTexCoords).r;
  125. height = height * 0.7 - 0.35;
  126. vec3 pos = INTERPOLATE(tcPosition) + norm * height;
  127. gl_Position = mvp * vec4(pos, 1.0);
  128. }