From 1e08193a1678675ac5869b76e8a2339f6de5b773 Mon Sep 17 00:00:00 2001 From: Dan Goodliffe Date: Thu, 26 Feb 2026 18:04:06 +0000 Subject: Support for the BillboardPainter Based on the ShadowStenciller, creates flattened images of a model for simplified mass use in a scene. --- gfx/gl/shaders/billboardPainter.frag | 22 ++++++++++++++++++++++ gfx/gl/shaders/billboardPainter.geom | 34 ++++++++++++++++++++++++++++++++++ gfx/gl/shaders/billboardPainter.vert | 23 +++++++++++++++++++++++ 3 files changed, 79 insertions(+) create mode 100644 gfx/gl/shaders/billboardPainter.frag create mode 100644 gfx/gl/shaders/billboardPainter.geom create mode 100644 gfx/gl/shaders/billboardPainter.vert (limited to 'gfx/gl/shaders') diff --git a/gfx/gl/shaders/billboardPainter.frag b/gfx/gl/shaders/billboardPainter.frag new file mode 100644 index 0000000..354f2ab --- /dev/null +++ b/gfx/gl/shaders/billboardPainter.frag @@ -0,0 +1,22 @@ +#version 460 core + +layout(binding = 0) uniform sampler2D textureAlbedo; +layout(location = 0) out vec4 bNormal; +layout(location = 1) out vec4 bAlbedoSpec; + +include(`materialDetail.glsl') +include(`materialCommon.glsl') +in vec2 gTexCoords; +in vec3 gNormal; +in vec4 gColour; +flat in MaterialDetail gMaterial; + +void +main() +{ + vec4 textureColour = getTextureColour(gMaterial, gTexCoords); + float opaque = step(0.5, mix(textureColour.a, 1, gColour.a)); + bNormal = vec4(gNormal, opaque); + gl_FragDepth = mix(1.0, gl_FragCoord.z, opaque); + bAlbedoSpec = mix(textureColour, vec4(gColour.rgb, 1), gColour.a); +} diff --git a/gfx/gl/shaders/billboardPainter.geom b/gfx/gl/shaders/billboardPainter.geom new file mode 100644 index 0000000..abd5f83 --- /dev/null +++ b/gfx/gl/shaders/billboardPainter.geom @@ -0,0 +1,34 @@ +#version 460 core + +include(`materialDetail.glsl') + +layout(triangles) in; +layout(triangle_strip, max_vertices = 24) out; + +uniform mat4 viewProjection[8]; +uniform mat4 view[8]; +in vec3 FragPos[]; +in vec2 TexCoords[]; +flat in MaterialDetail Material[]; +in vec3 Normal[]; +in vec4 Colour[]; +out vec2 gTexCoords; +out vec3 gNormal; +out vec4 gColour; +flat out MaterialDetail gMaterial; + +void +main() +{ + for (gl_Layer = 0; gl_Layer < viewProjection.length(); ++gl_Layer) { + for (int v = 0; v < FragPos.length(); ++v) { + gl_Position = viewProjection[gl_Layer] * vec4(FragPos[v], 1); + gNormal = (view[gl_Layer] * vec4(Normal[v], 1)).xyz; + gTexCoords = TexCoords[v]; + gMaterial = Material[v]; + gColour = Colour[v]; + EmitVertex(); + } + EndPrimitive(); + } +} diff --git a/gfx/gl/shaders/billboardPainter.vert b/gfx/gl/shaders/billboardPainter.vert new file mode 100644 index 0000000..d7c1219 --- /dev/null +++ b/gfx/gl/shaders/billboardPainter.vert @@ -0,0 +1,23 @@ +#version 460 core + +layout(binding = 1) uniform usampler2DRect materialData; + +include(`meshIn.glsl') +include(`materialDetail.glsl') +include(`getMaterialDetail.glsl') + +out vec3 FragPos; +out vec2 TexCoords; +flat out MaterialDetail Material; +out vec3 Normal; +out vec4 Colour; + +void +main() +{ + TexCoords = texCoord; + Material = getMaterialDetail(material); + FragPos = position; + Colour = colour; + Normal = normal; +} -- cgit v1.3