2019-11-11 17:14:51 +01:00
|
|
|
#version 330
|
|
|
|
|
uniform mat4 VP;
|
|
|
|
|
uniform mat4 invVP;
|
|
|
|
|
uniform vec2 mouse;
|
2020-02-04 17:26:07 +01:00
|
|
|
uniform vec2 texStep;
|
2019-11-11 17:14:51 +01:00
|
|
|
uniform float radius;
|
2020-03-09 23:48:12 +01:00
|
|
|
uniform vec3 cameraRight;
|
2019-11-11 17:14:51 +01:00
|
|
|
uniform sampler2D gbufferD;
|
2020-05-07 18:37:05 +02:00
|
|
|
#ifdef HLSL
|
|
|
|
|
uniform sampler2D texa; // direct3d12 unit align
|
|
|
|
|
#endif
|
2019-11-11 17:14:51 +01:00
|
|
|
in vec4 pos;
|
|
|
|
|
in vec2 nor;
|
|
|
|
|
in vec2 tex;
|
|
|
|
|
out vec2 texCoord;
|
2020-03-09 23:48:12 +01:00
|
|
|
// mat3 rotAxis(vec3 axis, float a) {
|
|
|
|
|
// float c = cos(a);
|
|
|
|
|
// vec3 as = axis * sin(a);
|
|
|
|
|
// mat3 p = mat3(axis.x * axis, axis.y * axis, axis.z * axis);
|
|
|
|
|
// mat3 q = mat3(c, -as.z, as.y, as.z, c, -as.x, -as.y, as.x, c);
|
|
|
|
|
// return p * (1.0 - c) + q;
|
|
|
|
|
// }
|
2020-02-04 17:26:07 +01:00
|
|
|
vec3 getPos(vec2 uv) {
|
2020-05-07 18:37:05 +02:00
|
|
|
#ifdef HLSL
|
2020-05-08 00:20:31 +02:00
|
|
|
float keep = textureLod(texa, vec2(0.0, 0.0), 0.0).r; // direct3d12 unit align
|
2020-05-12 19:24:09 +02:00
|
|
|
float keep2 = pos.x + nor.x;
|
2020-05-08 00:20:31 +02:00
|
|
|
#endif
|
|
|
|
|
#if defined(HLSL) || defined(METAL)
|
2020-05-07 18:37:05 +02:00
|
|
|
float depth = textureLod(gbufferD, vec2(uv.x, 1.0 - uv.y), 0.0).r;
|
|
|
|
|
#else
|
2020-02-04 17:26:07 +01:00
|
|
|
float depth = textureLod(gbufferD, uv, 0.0).r;
|
2020-05-07 18:37:05 +02:00
|
|
|
#endif
|
2020-02-04 17:26:07 +01:00
|
|
|
vec4 wpos = vec4(uv * 2.0 - 1.0, depth * 2.0 - 1.0, 1.0);
|
|
|
|
|
wpos = invVP * wpos;
|
|
|
|
|
return wpos.xyz / wpos.w;
|
|
|
|
|
}
|
|
|
|
|
vec3 getNormal(vec3 p0, vec2 uv) {
|
|
|
|
|
vec3 p1 = getPos(uv + vec2(texStep.x * 4, 0));
|
|
|
|
|
vec3 p2 = getPos(uv + vec2(0, texStep.y * 4));
|
|
|
|
|
return normalize(cross(p2 - p0, p1 - p0));
|
2019-11-11 17:14:51 +01:00
|
|
|
}
|
2020-03-09 23:48:12 +01:00
|
|
|
void createBasis(vec3 normal, out vec3 tangent, out vec3 binormal) {
|
|
|
|
|
tangent = normalize(cameraRight - normal * dot(cameraRight, normal));
|
|
|
|
|
binormal = cross(tangent, normal);
|
|
|
|
|
}
|
2019-11-11 17:14:51 +01:00
|
|
|
void main() {
|
|
|
|
|
texCoord = tex;
|
2020-02-04 17:26:07 +01:00
|
|
|
vec3 wpos = getPos(mouse);
|
|
|
|
|
vec2 uv1 = mouse + texStep * 4;
|
|
|
|
|
vec2 uv2 = mouse - texStep * 4;
|
|
|
|
|
vec3 wpos1 = getPos(uv1);
|
|
|
|
|
vec3 wpos2 = getPos(uv2);
|
2019-11-11 17:14:51 +01:00
|
|
|
vec3 n = normalize(
|
2020-02-04 17:26:07 +01:00
|
|
|
getNormal(wpos, mouse) +
|
|
|
|
|
getNormal(wpos1, uv1) +
|
|
|
|
|
getNormal(wpos2, uv2)
|
2019-11-11 17:14:51 +01:00
|
|
|
);
|
2020-03-09 23:48:12 +01:00
|
|
|
// float ax = acos(dot(vec3(1,0,0), vec3(n.x,0,0)));
|
|
|
|
|
// float az = acos(dot(vec3(0,0,1), vec3(0,0,n.z)));
|
|
|
|
|
// float sy = -sign(n.y);
|
|
|
|
|
// wpos +=
|
|
|
|
|
// rotAxis(vec3(1,0,0), -az * sy + 3.14/2) *
|
|
|
|
|
// rotAxis(vec3(0,0,1), ax + 3.14/2) *
|
|
|
|
|
// (pos.xyz * radius);
|
|
|
|
|
vec3 n_tan;
|
|
|
|
|
vec3 n_bin;
|
|
|
|
|
createBasis(n, n_tan, n_bin);
|
|
|
|
|
if (gl_VertexID == 0) wpos += normalize(-n_tan - n_bin) * 0.7 * radius;
|
|
|
|
|
else if (gl_VertexID == 1) wpos += normalize( n_tan - n_bin) * 0.7 * radius;
|
|
|
|
|
else if (gl_VertexID == 2) wpos += normalize( n_tan + n_bin) * 0.7 * radius;
|
|
|
|
|
else if (gl_VertexID == 3) wpos += normalize(-n_tan + n_bin) * 0.7 * radius;
|
2020-02-04 17:26:07 +01:00
|
|
|
gl_Position = VP * vec4(wpos, 1.0);
|
2019-11-11 17:14:51 +01:00
|
|
|
}
|