summaryrefslogtreecommitdiff
path: root/gfx/gl/shaders
diff options
context:
space:
mode:
Diffstat (limited to 'gfx/gl/shaders')
-rw-r--r--gfx/gl/shaders/billboard.frag28
-rw-r--r--gfx/gl/shaders/billboard.vert23
2 files changed, 51 insertions, 0 deletions
diff --git a/gfx/gl/shaders/billboard.frag b/gfx/gl/shaders/billboard.frag
new file mode 100644
index 0000000..1e2c4ae
--- /dev/null
+++ b/gfx/gl/shaders/billboard.frag
@@ -0,0 +1,28 @@
+#version 460 core
+
+const float tau = 6.28318531;
+
+layout(binding = 0) uniform sampler2DArray billboardDepth;
+layout(binding = 1) uniform sampler2DArray billboardNormal;
+layout(binding = 2) uniform sampler2DArray billboardAlbedo;
+uniform mat4 viewProjection;
+uniform float size;
+
+include(`materialOut.glsl')
+
+flat in ivec3 ModelPos;
+flat in float Yaw;
+flat in float Depth;
+
+void
+main()
+{
+ int viewAngle = int(round(8 * Yaw / tau)) % 8;
+ vec3 texel = vec3(gl_PointCoord * vec2(-1, 1) + vec2(1, 0), viewAngle);
+ gAlbedoSpec = texture(billboardAlbedo, texel);
+ if (gAlbedoSpec.a < 0.5) {
+ discard;
+ }
+ gPosition = ivec4(ModelPos + vec3(0, 0, size * 2 * (1 - gl_PointCoord.y)), 1);
+ gNormal = texture(billboardNormal, texel) * vec4(-1, -1, 1, 1);
+}
diff --git a/gfx/gl/shaders/billboard.vert b/gfx/gl/shaders/billboard.vert
new file mode 100644
index 0000000..2d73084
--- /dev/null
+++ b/gfx/gl/shaders/billboard.vert
@@ -0,0 +1,23 @@
+#version 460 core
+
+uniform mat4 viewProjection;
+uniform ivec4 viewPort;
+uniform ivec3 viewPoint;
+uniform vec3 centre;
+uniform float size;
+layout(location = 0) in ivec3 modelPos;
+layout(location = 1) in float yaw;
+
+flat out ivec3 ModelPos;
+flat out float Yaw;
+flat out float Depth;
+
+void
+main()
+{
+ ModelPos = modelPos;
+ Yaw = yaw;
+ gl_Position = viewProjection * vec4(modelPos - viewPoint + centre, 1);
+ Depth = gl_Position.w;
+ gl_PointSize = (viewPort.w * size * 2) / gl_Position.w;
+}