diff options
| author | Dan Goodliffe <dan@randomdan.homeip.net> | 2026-02-28 13:49:27 +0000 |
|---|---|---|
| committer | Dan Goodliffe <dan@randomdan.homeip.net> | 2026-02-28 13:54:13 +0000 |
| commit | 9ecec749060a05705d7c7eb200949e17a84702a1 (patch) | |
| tree | db36f49685662d6c423eb196fc5e64c5f89f5daa /gfx/gl/shaders | |
| parent | Use RelativeDistance in Camera near/fear and expose member variables (diff) | |
| download | ilt-9ecec749060a05705d7c7eb200949e17a84702a1.tar.bz2 ilt-9ecec749060a05705d7c7eb200949e17a84702a1.tar.xz ilt-9ecec749060a05705d7c7eb200949e17a84702a1.zip | |
Add BillboardProgram to SceneShader
The implementation is overly simple/incomplete, I'm not even convince
what is there is right, but it's a decent start.
Diffstat (limited to 'gfx/gl/shaders')
| -rw-r--r-- | gfx/gl/shaders/billboard.frag | 28 | ||||
| -rw-r--r-- | gfx/gl/shaders/billboard.vert | 23 |
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; +} |
