Fixed alignment issue of point lights buffer

Instead of using an array of descriptors for storing the lights, now
only one descriptor maps the entire array.
This commit is contained in:
Lorenzo Torres 2025-08-09 15:02:53 +02:00
parent 503ed33aec
commit 93e91d7902
2 changed files with 26 additions and 27 deletions

View file

@ -2,7 +2,13 @@
#define MAX_POINT_LIGHTS 1024 #define MAX_POINT_LIGHTS 1024
struct PointLight {
vec3 position;
vec3 ambient;
vec3 diffuse;
vec3 specular;
vec3 data;
};
layout(location = 0) out vec4 outColor; layout(location = 0) out vec4 outColor;
@ -17,14 +23,9 @@ layout (binding = 2) uniform DirectionalLight {
vec3 diffuse; vec3 diffuse;
vec3 specular; vec3 specular;
} directional_light; } directional_light;
layout (binding = 5) uniform PointLight { layout (binding = 5) uniform PointLights {
vec3 position; PointLight point_lights[MAX_POINT_LIGHTS];
vec3 ambient; } point_lights;
vec3 diffuse;
vec3 specular;
vec3 data;
} point_lights[MAX_POINT_LIGHTS];
layout (binding = 3) uniform ViewUniform { layout (binding = 3) uniform ViewUniform {
vec3 pos; vec3 pos;
@ -49,19 +50,19 @@ vec3 calc_directional_light(vec3 normal, vec3 viewDir) {
} }
vec3 calc_point_light(int index, vec3 normal, vec3 fragPos, vec3 viewDir) { vec3 calc_point_light(int index, vec3 normal, vec3 fragPos, vec3 viewDir) {
float constant = point_lights[index].data[0]; float constant = point_lights.point_lights[index].data[0];
float linear = point_lights[index].data[1]; float linear = point_lights.point_lights[index].data[1];
float quadratic = point_lights[index].data[2]; float quadratic = point_lights.point_lights[index].data[2];
vec3 lightDir = normalize(point_lights[index].position - fragPos); vec3 lightDir = normalize(point_lights.point_lights[index].position - fragPos);
float diff = max(dot(normal, lightDir), 0.0); float diff = max(dot(normal, lightDir), 0.0);
vec3 reflectDir = reflect(-lightDir, normal); vec3 reflectDir = reflect(-lightDir, normal);
float spec = pow(max(dot(viewDir, reflectDir), 0.0), 2); float spec = pow(max(dot(viewDir, reflectDir), 0.0), 2);
float distance = length(point_lights[index].position - fragPos); float distance = length(point_lights.point_lights[index].position - fragPos);
float attenuation = 1.0 / (constant + linear * distance + quadratic * (distance * distance)); float attenuation = 1.0 / (constant + linear * distance + quadratic * (distance * distance));
vec3 ambient = point_lights[index].ambient * vec3(texture(textureSampler, TexCoords)); vec3 ambient = point_lights.point_lights[index].ambient * vec3(texture(textureSampler, TexCoords));
vec3 diffuse = point_lights[index].diffuse * diff * vec3(texture(textureSampler, TexCoords)); vec3 diffuse = point_lights.point_lights[index].diffuse * diff * vec3(texture(textureSampler, TexCoords));
vec3 specular = point_lights[index].specular * spec * vec3(texture(diffuseSampler, TexCoords)); vec3 specular = point_lights.point_lights[index].specular * spec * vec3(texture(diffuseSampler, TexCoords));
ambient *= attenuation; ambient *= attenuation;
diffuse *= attenuation; diffuse *= attenuation;
specular *= attenuation; specular *= attenuation;

View file

@ -318,7 +318,7 @@ pub fn init(allocator: Allocator, device: vk.Device, swapchain: vk.Swapchain, re
const point_lights_binding = c.VkDescriptorSetLayoutBinding{ const point_lights_binding = c.VkDescriptorSetLayoutBinding{
.binding = 5, .binding = 5,
.descriptorType = c.VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, .descriptorType = c.VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
.descriptorCount = max_point_lights, .descriptorCount = 1,
.stageFlags = c.VK_SHADER_STAGE_FRAGMENT_BIT, .stageFlags = c.VK_SHADER_STAGE_FRAGMENT_BIT,
}; };
@ -409,7 +409,7 @@ pub fn init(allocator: Allocator, device: vk.Device, swapchain: vk.Swapchain, re
const size = c.VkDescriptorPoolSize{ const size = c.VkDescriptorPoolSize{
.type = c.VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, .type = c.VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
.descriptorCount = 5 + max_point_lights, .descriptorCount = 6,
}; };
const sampler_size = c.VkDescriptorPoolSize{ const sampler_size = c.VkDescriptorPoolSize{
@ -584,21 +584,19 @@ pub fn init(allocator: Allocator, device: vk.Device, swapchain: vk.Swapchain, re
const point_lights: []lights.PointLight = @as([*]lights.PointLight, @alignCast(@ptrCast(point_lights_data)))[0..max_point_lights]; const point_lights: []lights.PointLight = @as([*]lights.PointLight, @alignCast(@ptrCast(point_lights_data)))[0..max_point_lights];
var point_lights_descriptor_buffer_info: [max_point_lights]c.VkDescriptorBufferInfo = undefined; var point_lights_descriptor_buffer_info: c.VkDescriptorBufferInfo = undefined;
for (0..max_point_lights) |i| { point_lights_descriptor_buffer_info.buffer = point_lights_buffer.handle;
point_lights_descriptor_buffer_info[i].buffer = point_lights_buffer.handle; point_lights_descriptor_buffer_info.offset = 0;
point_lights_descriptor_buffer_info[i].offset = @sizeOf(lights.PointLight) * i; point_lights_descriptor_buffer_info.range = @sizeOf(lights.PointLight) * max_point_lights;
point_lights_descriptor_buffer_info[i].range = @sizeOf(lights.PointLight);
}
const write_point_lights_descriptor_set = c.VkWriteDescriptorSet{ const write_point_lights_descriptor_set = c.VkWriteDescriptorSet{
.sType = c.VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET, .sType = c.VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET,
.dstSet = descriptor_set, .dstSet = descriptor_set,
.dstBinding = 5, .dstBinding = 5,
.dstArrayElement = 0, .dstArrayElement = 0,
.descriptorCount = max_point_lights, .descriptorCount = 1,
.descriptorType = c.VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, .descriptorType = c.VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
.pBufferInfo = @ptrCast(point_lights_descriptor_buffer_info[0..].ptr), .pBufferInfo = @ptrCast(&point_lights_descriptor_buffer_info),
}; };
c.vkUpdateDescriptorSets(device.handle, 1, &write_point_lights_descriptor_set, 0, null); c.vkUpdateDescriptorSets(device.handle, 1, &write_point_lights_descriptor_set, 0, null);