parent
77288a205b
commit
6d1dac453e
|
@ -2,18 +2,16 @@
|
|||
#extension GL_EXT_ray_query : require
|
||||
#extension GL_EXT_shader_16bit_storage : require
|
||||
|
||||
|
||||
// FIXME shader specialization
|
||||
layout(local_size_x = 16, local_size_y = 8, local_size_z = 1) in;
|
||||
|
||||
// struct Light {
|
||||
// vec4 pos_r;
|
||||
// vec4 color;
|
||||
// };
|
||||
|
||||
layout(binding = 0, set = 0, rgba8) uniform image2D image;
|
||||
layout(binding = 1, set = 0) uniform accelerationStructureEXT tlas;
|
||||
layout(binding = 2, set = 0) uniform UBO {
|
||||
mat4 inv_proj, inv_view;
|
||||
|
||||
// TODO combine
|
||||
//int num_lights;
|
||||
//Light lights[];
|
||||
} ubo;
|
||||
|
@ -34,6 +32,20 @@ layout(std430, binding = 3, set = 0) readonly buffer Kusochki { Kusok kusochki[]
|
|||
layout(std430, binding = 4, set = 0) readonly buffer Indices { uint16_t indices[]; };
|
||||
layout(std430, binding = 5, set = 0) readonly buffer Vertices { Vertex vertices[]; };
|
||||
|
||||
// TODO #include, use from here and regular shader
|
||||
struct Light {
|
||||
vec4 pos_r;
|
||||
vec4 color;
|
||||
};
|
||||
// FIXME what should this be?
|
||||
const float dlight_attenuation_const = 5000.;
|
||||
// TODO specialize in vk_rtx.c
|
||||
layout (constant_id = 1) const uint max_dlights = 32;
|
||||
layout(set=0,binding=6) uniform UBODLights {
|
||||
uint num_lights;
|
||||
Light lights[max_dlights];
|
||||
};
|
||||
|
||||
void main() {
|
||||
vec2 res = imageSize(image);
|
||||
vec2 uv = (gl_GlobalInvocationID.xy + .5) / res * 2. - 1.;
|
||||
|
@ -53,7 +65,7 @@ void main() {
|
|||
if (rayQueryGetIntersectionTypeEXT(rayQuery, true) != gl_RayQueryCommittedIntersectionTriangleEXT) {
|
||||
C = vec3(1., 0., 1.);
|
||||
} else {
|
||||
//vec3 pos = O+D*l;
|
||||
vec3 pos = O+D*l;
|
||||
//C = fract(pos/100.);
|
||||
|
||||
//const int instance_index = rayQueryGetIntersectionInstanceIdEXT(rayQuery, true);
|
||||
|
@ -75,11 +87,22 @@ void main() {
|
|||
//const vec3 normal = vertices[kusochki[instance_index].vertex_offset].normal;
|
||||
|
||||
//const vec3 normal = vertices[prim_index * 3].normal;
|
||||
C = normal * .5 + .5;
|
||||
//C = normal * .5 + .5;
|
||||
|
||||
/* C.r = float(first_vertex_index & 31) / 31.f; */
|
||||
/* C.g = float((first_vertex_index >> 5) & 31) / 31.f; */
|
||||
/* C.b = float((first_vertex_index >> 10) & 31) / 31.f; */
|
||||
|
||||
const vec3 baseColor = vec3(1.);
|
||||
for (uint i = 0; i < num_lights; ++i) {
|
||||
const vec4 light_pos_r = lights[i].pos_r;
|
||||
const vec3 light_color = lights[i].color.rgb;
|
||||
const vec3 light_dir = light_pos_r.xyz - pos;
|
||||
const float d2 = dot(light_dir, light_dir);
|
||||
const float r2 = light_pos_r.w * light_pos_r.w;
|
||||
const float attenuation = dlight_attenuation_const / (d2 + r2 * .5);
|
||||
C += baseColor.rgb * light_color * max(0., dot(normalize(light_dir), normal)) * attenuation;
|
||||
}
|
||||
}
|
||||
|
||||
imageStore(image, ivec2(gl_GlobalInvocationID.xy), vec4(C, 1.));
|
||||
|
|
|
@ -575,30 +575,14 @@ void VK_RenderScheduleDraw( const render_draw_t *draw )
|
|||
draw_command->ubo_offset = g_render_state.current_ubo_offset;
|
||||
}
|
||||
|
||||
void VK_RenderEnd( VkCommandBuffer cmdbuf )
|
||||
// Return offset of dlights data into UBO buffer
|
||||
static uint32_t writeDlightsToUBO()
|
||||
{
|
||||
// TODO we can sort collected draw commands for more efficient and correct rendering
|
||||
// that requires adding info about distance to camera for correct order-dependent blending
|
||||
|
||||
int pipeline = -1;
|
||||
int texture = -1;
|
||||
int lightmap = -1;
|
||||
uint32_t ubo_offset = -1;
|
||||
|
||||
ASSERT(!vk_core.rtx);
|
||||
|
||||
{
|
||||
const VkDeviceSize offset = 0;
|
||||
vkCmdBindVertexBuffers(cmdbuf, 0, 1, &g_render.buffer.buffer, &offset);
|
||||
vkCmdBindIndexBuffer(cmdbuf, g_render.buffer.buffer, 0, VK_INDEX_TYPE_UINT16);
|
||||
}
|
||||
|
||||
{
|
||||
vk_ubo_lights_t* ubo_lights;
|
||||
const uint32_t ubo_lights_offset = allocUniform(sizeof(*ubo_lights), 4);
|
||||
if (ubo_lights_offset == UINT32_MAX) {
|
||||
gEngine.Con_Printf(S_ERROR "Cannot allocate UBO for DLights\n");
|
||||
return;
|
||||
return UINT32_MAX;
|
||||
}
|
||||
ubo_lights = (vk_ubo_lights_t*)((byte*)(g_render.uniform_buffer.mapped) + ubo_lights_offset);
|
||||
|
||||
|
@ -623,9 +607,33 @@ void VK_RenderEnd( VkCommandBuffer cmdbuf )
|
|||
ubo_lights->num_lights++;
|
||||
}
|
||||
|
||||
vkCmdBindDescriptorSets(vk_core.cb, VK_PIPELINE_BIND_POINT_GRAPHICS, g_render.pipeline_layout, 3, 1, vk_desc.ubo_sets + 1, 1, &ubo_lights_offset);
|
||||
return ubo_lights_offset;
|
||||
}
|
||||
|
||||
void VK_RenderEnd( VkCommandBuffer cmdbuf )
|
||||
{
|
||||
// TODO we can sort collected draw commands for more efficient and correct rendering
|
||||
// that requires adding info about distance to camera for correct order-dependent blending
|
||||
|
||||
int pipeline = -1;
|
||||
int texture = -1;
|
||||
int lightmap = -1;
|
||||
uint32_t ubo_offset = -1;
|
||||
|
||||
const uint32_t dlights_ubo_offset = writeDlightsToUBO();
|
||||
if (dlights_ubo_offset == UINT32_MAX)
|
||||
return;
|
||||
|
||||
ASSERT(!vk_core.rtx);
|
||||
|
||||
{
|
||||
const VkDeviceSize offset = 0;
|
||||
vkCmdBindVertexBuffers(cmdbuf, 0, 1, &g_render.buffer.buffer, &offset);
|
||||
vkCmdBindIndexBuffer(cmdbuf, g_render.buffer.buffer, 0, VK_INDEX_TYPE_UINT16);
|
||||
}
|
||||
|
||||
vkCmdBindDescriptorSets(vk_core.cb, VK_PIPELINE_BIND_POINT_GRAPHICS, g_render.pipeline_layout, 3, 1, vk_desc.ubo_sets + 1, 1, &dlights_ubo_offset);
|
||||
|
||||
for (int i = 0; i < g_render_state.num_draw_commands; ++i) {
|
||||
const draw_command_t *const draw = g_render_state.draw_commands + i;
|
||||
const vk_buffer_alloc_t *vertex_buffer = getBufferFromHandle( draw->draw.vertex_buffer );
|
||||
|
@ -684,6 +692,10 @@ void VK_RenderDebugLabelEnd( void )
|
|||
|
||||
void VK_RenderEndRTX( VkCommandBuffer cmdbuf, VkImageView img_dst_view, VkImage img_dst, uint32_t w, uint32_t h )
|
||||
{
|
||||
const uint32_t dlights_ubo_offset = writeDlightsToUBO();
|
||||
if (dlights_ubo_offset == UINT32_MAX)
|
||||
return;
|
||||
|
||||
ASSERT(vk_core.rtx);
|
||||
VK_RaySceneBegin();
|
||||
for (int i = 0; i < g_render_state.num_draw_commands; ++i) {
|
||||
|
@ -725,6 +737,12 @@ void VK_RenderEndRTX( VkCommandBuffer cmdbuf, VkImageView img_dst_view, VkImage
|
|||
.size = sizeof(float) * 16 * 2,
|
||||
},
|
||||
|
||||
.dlights = {
|
||||
.buffer = g_render.uniform_buffer.buffer,
|
||||
.offset = dlights_ubo_offset,
|
||||
.size = sizeof(vk_ubo_lights_t),
|
||||
},
|
||||
|
||||
.geometry_data = {
|
||||
.buffer = g_render.buffer.buffer,
|
||||
.size = g_render.buffer_free_offset,
|
||||
|
|
|
@ -317,6 +317,11 @@ void VK_RaySceneEnd(const vk_ray_scene_render_args_t* args)
|
|||
.accelerationStructureCount = 1,
|
||||
.pAccelerationStructures = &g_rtx.tlas,
|
||||
};
|
||||
const VkDescriptorBufferInfo dbi_dlights = {
|
||||
.buffer = args->dlights.buffer,
|
||||
.offset = args->dlights.offset,
|
||||
.range = args->dlights.size,
|
||||
};
|
||||
const VkWriteDescriptorSet wds[] = {
|
||||
{
|
||||
.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET,
|
||||
|
@ -372,6 +377,15 @@ void VK_RaySceneEnd(const vk_ray_scene_render_args_t* args)
|
|||
.dstArrayElement = 0,
|
||||
.pBufferInfo = &dbi_vertices,
|
||||
},
|
||||
{
|
||||
.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET,
|
||||
.descriptorCount = 1,
|
||||
.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
|
||||
.dstSet = g_rtx.desc_set,
|
||||
.dstBinding = 6,
|
||||
.dstArrayElement = 0,
|
||||
.pBufferInfo = &dbi_dlights,
|
||||
},
|
||||
};
|
||||
|
||||
vkUpdateDescriptorSets(vk_core.device, ARRAYSIZE(wds), wds, 0, NULL);
|
||||
|
@ -444,6 +458,11 @@ static void createLayouts( void ) {
|
|||
.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
|
||||
.descriptorCount = 1,
|
||||
.stageFlags = VK_SHADER_STAGE_COMPUTE_BIT,
|
||||
}, {
|
||||
.binding = 6,
|
||||
.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
|
||||
.descriptorCount = 1,
|
||||
.stageFlags = VK_SHADER_STAGE_COMPUTE_BIT,
|
||||
},
|
||||
};
|
||||
|
||||
|
@ -470,7 +489,7 @@ static void createLayouts( void ) {
|
|||
VkDescriptorPoolSize pools[] = {
|
||||
{.type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, .descriptorCount = 1},
|
||||
{.type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, .descriptorCount = 3},
|
||||
{.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, .descriptorCount = 1},
|
||||
{.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, .descriptorCount = 2},
|
||||
{.type = VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR, .descriptorCount = 1},
|
||||
};
|
||||
|
||||
|
|
|
@ -35,7 +35,11 @@ typedef struct {
|
|||
uint32_t size;
|
||||
} ubo;
|
||||
|
||||
// TODO dlights
|
||||
struct {
|
||||
VkBuffer buffer;
|
||||
uint32_t offset;
|
||||
uint32_t size;
|
||||
} dlights;
|
||||
|
||||
// Buffer holding vertex and index data
|
||||
struct {
|
||||
|
|
Loading…
Reference in New Issue