diff --git a/libs/video/renderer/vulkan/pl_quake_def.plist b/libs/video/renderer/vulkan/pl_quake_def.plist index 62a6be268..c747fe651 100644 --- a/libs/video/renderer/vulkan/pl_quake_def.plist +++ b/libs/video/renderer/vulkan/pl_quake_def.plist @@ -289,7 +289,7 @@ binding = 0; descriptorType = combined_image_sampler; descriptorCount = 1; - stageFlags = fragment; + stageFlags = fragment|vertex; }, ); }; @@ -507,7 +507,7 @@ setLayouts = (particle_set, particle_set, particle_set); }; partdraw_layout = { - setLayouts = (matrix_set); + setLayouts = (matrix_set, texture_set); pushConstantRanges = ( { stageFlags = vertex; diff --git a/libs/video/renderer/vulkan/shader/particle.frag b/libs/video/renderer/vulkan/shader/particle.frag index 573a00a88..5a5f5a887 100644 --- a/libs/video/renderer/vulkan/shader/particle.frag +++ b/libs/video/renderer/vulkan/shader/particle.frag @@ -8,13 +8,13 @@ layout (location = 0) out vec4 frag_color; void main (void) { - vec4 c = vec4 (1,1,1,1);//color; + vec4 c = color; vec2 x = uv_tr.xy; float a = 1 - dot (x, x); if (a <= 0) { discard; } - c.a *= sqrt (a); + c *= (a); frag_color = c; } diff --git a/libs/video/renderer/vulkan/shader/particle.vert b/libs/video/renderer/vulkan/shader/particle.vert index 2d38b9ffd..40a35c2c3 100644 --- a/libs/video/renderer/vulkan/shader/particle.vert +++ b/libs/video/renderer/vulkan/shader/particle.vert @@ -4,6 +4,7 @@ layout (set = 0, binding = 0) uniform #include "matrices.h" ; +layout (set = 1, binding = 0) uniform sampler2D Palette; layout (push_constant) uniform PushConstants { mat4 Model; @@ -24,6 +25,9 @@ main (void) // geometry shader will take care of Projection gl_Position = View * (Model * position); o_velocity = View * (Model * velocity); - o_color = color; + uint c = floatBitsToInt (color.x); + uint x = c & 0x0f; + uint y = (c >> 4) & 0x0f; + o_color = texture (Palette, vec2 (x, y) / 15.0); o_ramp = ramp; } diff --git a/libs/video/renderer/vulkan/vulkan_particles.c b/libs/video/renderer/vulkan/vulkan_particles.c index 64079b5f7..714f4c492 100644 --- a/libs/video/renderer/vulkan/vulkan_particles.c +++ b/libs/video/renderer/vulkan/vulkan_particles.c @@ -50,6 +50,7 @@ #include "QF/Vulkan/resource.h" #include "QF/Vulkan/staging.h" #include "QF/Vulkan/qf_matrices.h" +#include "QF/Vulkan/qf_palette.h" #include "QF/Vulkan/qf_particles.h" #include "QF/Vulkan/qf_renderpass.h" @@ -98,9 +99,10 @@ particle_begin_subpass (VkPipeline pipeline, qfv_renderframe_t *rFrame) dfunc->vkCmdBindPipeline (cmd, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline); VkDescriptorSet sets[] = { Vulkan_Matrix_Descriptors (ctx, ctx->curFrame), + Vulkan_Palette_Descriptor (ctx), }; dfunc->vkCmdBindDescriptorSets (cmd, VK_PIPELINE_BIND_POINT_GRAPHICS, - pctx->draw_layout, 0, 1, sets, 0, 0); + pctx->draw_layout, 0, 2, sets, 0, 0); dfunc->vkCmdSetViewport (cmd, 0, 1, &rFrame->renderpass->viewport); dfunc->vkCmdSetScissor (cmd, 0, 1, &rFrame->renderpass->scissor); }