From 10bd169bd4e1416c941faa2d5bc6a5be2e2fbfb8 Mon Sep 17 00:00:00 2001 From: Stanislaw Halik Date: Wed, 30 Aug 2023 20:36:44 +0200 Subject: [PATCH] shaders/lightmap: use uniform blocks --- shaders/lightmap.cpp | 45 +++++++++++++++++++++++++++++++------------ shaders/lightmap.frag | 18 ++++++++++------- shaders/lightmap.hpp | 19 ++++++------------ shaders/lightmap.vert | 19 +++++++++--------- 4 files changed, 60 insertions(+), 41 deletions(-) diff --git a/shaders/lightmap.cpp b/shaders/lightmap.cpp index 1be6080b..0585223b 100644 --- a/shaders/lightmap.cpp +++ b/shaders/lightmap.cpp @@ -62,6 +62,16 @@ GL::Mesh make_light_mesh(T&& vert, U&& index) return mesh; } +struct Block final +{ + Vector4 light_color; + Vector2 scale; + Vector2 center_fragcoord; + Vector2 center_clip; + float range; + uint32_t falloff; +}; + } // namespace auto lightmap_shader::make_framebuffer(Vector2i size) -> Framebuffer @@ -200,13 +210,20 @@ lightmap_shader::lightmap_shader(texture_unit_cache& tuc) : tuc{tuc} light_mesh = make_light_mesh(GL::Buffer{blend_vertexes}, GL::Buffer{quad_indexes(0)}); setUniform(SamplerUniform, 0); - setUniform(LightColorUniform, 0xffffffff_rgbaf); - setUniform(SizeUniform, Vector2(1)); - setUniform(CenterFragcoordUniform, Vector2(0, 0)); - setUniform(CenterClipUniform, Vector2(-1, -1)); - setUniform(RangeUniform, 1.f); setUniform(ModeUniform, DrawLightmapMode); - setUniform(FalloffUniform, (uint32_t)light_falloff::constant); + + Block block { + .light_color = 0xffffffff_rgbaf, + .scale = Vector2(1), + .center_fragcoord = Vector2(0, 0), + .center_clip = Vector2(-1, -1), + .range = 1.f, + .falloff = (uint32_t)light_falloff::constant, + }; + + setUniformBlockBinding(uniformBlockIndex("Lightmap"_s), BlockUniform); + block_uniform_buf.setData({&block, 1}); + block_uniform_buf.bind(GL::Buffer::Target::Uniform, BlockUniform); } std::array lightmap_shader::quad_indexes(size_t N) @@ -246,12 +263,16 @@ void lightmap_shader::add_light(Vector2 neighbor_offset, const light_s& light) { 0u, GL::Framebuffer::ColorAttachment{0} }, }); - setUniform(LightColorUniform, Vector4(light.color) / 255.f); - setUniform(SizeUniform, Vector2(1) / real_image_size); - setUniform(CenterFragcoordUniform, center_fragcoord * image_size_ratio); - setUniform(CenterClipUniform, center_clip); - setUniform(RangeUniform, range * image_size_ratio.sum()/2); - setUniform(FalloffUniform, (uint32_t)light.falloff); + Block block = { + .light_color = Vector4(light.color) / 255.f, + .scale = Vector2(1) / real_image_size, + .center_fragcoord = center_fragcoord * image_size_ratio, + .center_clip = center_clip, + .range = range * image_size_ratio.sum()/2, + .falloff = (uint32_t)light.falloff, + }; + + block_uniform_buf.setSubData(0, {&block, 1}); setUniform(ModeUniform, DrawLightmapMode); AbstractShaderProgram::draw(light_mesh); diff --git a/shaders/lightmap.frag b/shaders/lightmap.frag index 9136a4a5..dec46f29 100644 --- a/shaders/lightmap.frag +++ b/shaders/lightmap.frag @@ -1,13 +1,17 @@ precision mediump float; layout (location = 2) uniform sampler2D sampler0; -layout (location = 3) uniform vec4 light_color; -layout (location = 4) uniform vec2 scale; -layout (location = 5) uniform vec2 center_fragcoord; -layout (location = 6) uniform vec2 center_clip; -layout (location = 7) uniform float range; -layout (location = 8) uniform uint mode; -layout (location = 9) uniform uint falloff; +layout (location = 3) uniform uint mode; + +layout (std140) +uniform Lightmap { + vec4 light_color; + vec2 scale; + vec2 center_fragcoord; + vec2 center_clip; + float range; + uint falloff; +}; layout (location = 0) out vec4 color0; layout (location = 1) out vec4 color1; diff --git a/shaders/lightmap.hpp b/shaders/lightmap.hpp index 2c08cc62..2dea87e9 100644 --- a/shaders/lightmap.hpp +++ b/shaders/lightmap.hpp @@ -58,17 +58,9 @@ struct lightmap_shader final : GL::AbstractShaderProgram private: enum : Int { SamplerUniform = 2, - LightColorUniform = 3, - SizeUniform = 4, - CenterFragcoordUniform = 5, - CenterClipUniform = 6, - RangeUniform = 7, - ModeUniform = 8, - FalloffUniform = 9, - }; - - enum : Int { - TextureSampler = 1, + ModeUniform = 3, + // GL_MAX_UNIFORM_BUFFER_BINDINGS must be at least 36 + BlockUniform = 35, }; enum ShaderMode : uint32_t @@ -88,8 +80,9 @@ struct lightmap_shader final : GL::AbstractShaderProgram void add_rect(Vector2 neighbor_offset, Pair minmax); [[nodiscard]] std::array& alloc_rect(); - texture_unit_cache& tuc; - GL::Buffer vertex_buf{NoCreate}, index_buf{NoCreate}; + texture_unit_cache& tuc; // NOLINT(*-avoid-const-or-ref-data-members) + GL::Buffer vertex_buf{NoCreate}, index_buf{NoCreate}, + block_uniform_buf{GL::Buffer::TargetHint::Uniform, }; Array> vertexes; // todo make a contiguous allocation Array> indexes; size_t count = 0, capacity = 0; diff --git a/shaders/lightmap.vert b/shaders/lightmap.vert index 2ed69f8b..1a8a39f1 100644 --- a/shaders/lightmap.vert +++ b/shaders/lightmap.vert @@ -1,16 +1,17 @@ precision mediump float; layout (location = 2) uniform sampler2D sampler0; -layout (location = 3) uniform vec4 light_color; -layout (location = 4) uniform vec2 scale; -layout (location = 5) uniform vec2 center_fragcoord; -layout (location = 6) uniform vec2 center_clip; -layout (location = 7) uniform float range; -layout (location = 8) uniform uint mode; -layout (location = 9) uniform uint falloff; +layout (location = 3) uniform uint mode; -//layout (location = 0) out vec2 frag_texcoords; -//layout (location = 1) flat out vec2 frag_light_coord; +layout (std140) +uniform Lightmap { + vec4 light_color; + vec2 scale; + vec2 center_fragcoord; + vec2 center_clip; + float range; + uint falloff; +}; layout (location = 0) in vec3 position;