cursor.vert.glsl 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. #version 330
  2. uniform mat4 VP;
  3. uniform mat4 invVP;
  4. uniform vec2 mouse;
  5. uniform vec2 texStep;
  6. uniform float radius;
  7. uniform vec3 cameraRight;
  8. uniform sampler2D gbufferD;
  9. #ifdef HLSL
  10. uniform sampler2D texa; // direct3d12 unit align
  11. #endif
  12. in vec4 pos;
  13. in vec2 nor;
  14. in vec2 tex;
  15. out vec2 texCoord;
  16. vec3 getPos(vec2 uv) {
  17. #ifdef HLSL
  18. float keep = textureLod(texa, vec2(0.0, 0.0), 0.0).r; // direct3d12 unit align
  19. float keep2 = pos.x + nor.x;
  20. #endif
  21. #if defined(HLSL) || defined(METAL) || defined(SPIRV)
  22. float depth = textureLod(gbufferD, vec2(uv.x, 1.0 - uv.y), 0.0).r;
  23. #else
  24. float depth = textureLod(gbufferD, uv, 0.0).r;
  25. #endif
  26. vec4 wpos = vec4(uv * 2.0 - 1.0, depth * 2.0 - 1.0, 1.0);
  27. wpos = invVP * wpos;
  28. return wpos.xyz / wpos.w;
  29. }
  30. vec3 getNormal(vec3 p0, vec2 uv) {
  31. vec2 texStepLocal = texStep; // TODO: SPIRV workaround
  32. vec3 p1 = getPos(uv + vec2(texStepLocal.x * 4, 0));
  33. vec3 p2 = getPos(uv + vec2(0, texStepLocal.y * 4));
  34. return normalize(cross(p2 - p0, p1 - p0));
  35. }
  36. void createBasis(vec3 normal, out vec3 tangent, out vec3 binormal) {
  37. tangent = normalize(cameraRight - normal * dot(cameraRight, normal));
  38. binormal = cross(tangent, normal);
  39. }
  40. void main() {
  41. texCoord = tex;
  42. vec3 wpos = getPos(mouse);
  43. vec2 uv1 = mouse + texStep * 4;
  44. vec2 uv2 = mouse - texStep * 4;
  45. vec3 wpos1 = getPos(uv1);
  46. vec3 wpos2 = getPos(uv2);
  47. vec3 n = normalize(
  48. getNormal(wpos, mouse) +
  49. getNormal(wpos1, uv1) +
  50. getNormal(wpos2, uv2)
  51. );
  52. vec3 n_tan;
  53. vec3 n_bin;
  54. createBasis(n, n_tan, n_bin);
  55. if (gl_VertexID == 0) wpos += normalize(-n_tan - n_bin) * 0.7 * radius;
  56. else if (gl_VertexID == 1) wpos += normalize( n_tan - n_bin) * 0.7 * radius;
  57. else if (gl_VertexID == 2) wpos += normalize( n_tan + n_bin) * 0.7 * radius;
  58. else if (gl_VertexID == 3) wpos += normalize(-n_tan + n_bin) * 0.7 * radius;
  59. gl_Position = VP * vec4(wpos, 1.0);
  60. }