mirror of
https://github.com/ZDoom/ZDRay.git
synced 2025-02-03 13:11:04 +00:00
Compile a rgen shader
This commit is contained in:
parent
edc4b159d0
commit
5d514f8c4b
2 changed files with 58 additions and 2 deletions
|
@ -263,8 +263,12 @@ void GPURaytracer::Raytrace(LevelMesh* level)
|
||||||
printf("Creating top level acceleration structure\n");
|
printf("Creating top level acceleration structure\n");
|
||||||
CreateTopLevelAccelerationStructure();
|
CreateTopLevelAccelerationStructure();
|
||||||
|
|
||||||
|
printf("Creating shaders\n");
|
||||||
|
CreateShaders();
|
||||||
|
|
||||||
cmdbuffer->end();
|
cmdbuffer->end();
|
||||||
|
|
||||||
|
#if 0
|
||||||
printf("Tracing light probes\n");
|
printf("Tracing light probes\n");
|
||||||
|
|
||||||
Worker::RunJob((int)mesh->lightProbes.size(), [=](int id) {
|
Worker::RunJob((int)mesh->lightProbes.size(), [=](int id) {
|
||||||
|
@ -301,6 +305,7 @@ void GPURaytracer::Raytrace(LevelMesh* level)
|
||||||
const SurfaceTask& task = tasks[id];
|
const SurfaceTask& task = tasks[id];
|
||||||
RaytraceSurfaceSample(mesh->surfaces[task.surf].get(), task.x, task.y);
|
RaytraceSurfaceSample(mesh->surfaces[task.surf].get(), task.x, task.y);
|
||||||
});
|
});
|
||||||
|
#endif
|
||||||
|
|
||||||
printf("Raytrace complete\n");
|
printf("Raytrace complete\n");
|
||||||
}
|
}
|
||||||
|
@ -520,8 +525,8 @@ void GPURaytracer::CreateVertexAndIndexBuffers()
|
||||||
memcpy(data + indexoffset, mesh->MeshElements.Data(), indexbuffersize);
|
memcpy(data + indexoffset, mesh->MeshElements.Data(), indexbuffersize);
|
||||||
transferBuffer->Unmap();
|
transferBuffer->Unmap();
|
||||||
|
|
||||||
//cmdbuffer->copyBuffer(transferBuffer.get(), vertexBuffer.get(), vertexoffset);
|
cmdbuffer->copyBuffer(transferBuffer.get(), vertexBuffer.get(), vertexoffset);
|
||||||
//cmdbuffer->copyBuffer(transferBuffer.get(), indexBuffer.get(), indexoffset);
|
cmdbuffer->copyBuffer(transferBuffer.get(), indexBuffer.get(), indexoffset);
|
||||||
|
|
||||||
VkMemoryBarrier barrier = { VK_STRUCTURE_TYPE_MEMORY_BARRIER };
|
VkMemoryBarrier barrier = { VK_STRUCTURE_TYPE_MEMORY_BARRIER };
|
||||||
barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
|
barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
|
||||||
|
@ -690,3 +695,51 @@ void GPURaytracer::CreateTopLevelAccelerationStructure()
|
||||||
VkAccelerationStructureBuildRangeInfoKHR* rangeInfos[] = { &rangeInfo };
|
VkAccelerationStructureBuildRangeInfoKHR* rangeInfos[] = { &rangeInfo };
|
||||||
vkCmdBuildAccelerationStructuresKHR(cmdbuffer->buffer, 1, &buildInfo, rangeInfos);
|
vkCmdBuildAccelerationStructuresKHR(cmdbuffer->buffer, 1, &buildInfo, rangeInfos);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void GPURaytracer::CreateShaders()
|
||||||
|
{
|
||||||
|
std::string code = R"(
|
||||||
|
#version 460
|
||||||
|
#extension GL_EXT_ray_tracing : require
|
||||||
|
|
||||||
|
struct hitPayload
|
||||||
|
{
|
||||||
|
vec3 hitValue;
|
||||||
|
};
|
||||||
|
|
||||||
|
layout(location = 0) rayPayloadEXT hitPayload prd;
|
||||||
|
layout(set = 0, binding = 0) uniform accelerationStructureEXT acc;
|
||||||
|
layout(set = 0, binding = 1, rgba32f) uniform image2D image;
|
||||||
|
layout(set = 0, binding = 2) uniform Uniforms
|
||||||
|
{
|
||||||
|
mat4 viewInverse;
|
||||||
|
mat4 projInverse;
|
||||||
|
};
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
const vec2 pixelCenter = vec2(gl_LaunchIDEXT.xy) + vec2(0.5);
|
||||||
|
const vec2 inUV = pixelCenter / vec2(gl_LaunchSizeEXT.xy);
|
||||||
|
vec2 d = inUV * 2.0 - 1.0;
|
||||||
|
|
||||||
|
vec4 origin = viewInverse * vec4(0, 0, 0, 1);
|
||||||
|
vec4 target = projInverse * vec4(d.x, d.y, 1, 1);
|
||||||
|
vec4 direction = viewInverse * vec4(normalize(target.xyz), 0);
|
||||||
|
|
||||||
|
traceRayEXT(acc, gl_RayFlagsOpaqueEXT, 0xff, 0, 0, 0, origin.xyz, 0.001, direction.xyz, 10000.0, 0);
|
||||||
|
|
||||||
|
imageStore(image, ivec2(gl_LaunchIDEXT.xy), vec4(prd.hitValue, 1.0));
|
||||||
|
}
|
||||||
|
)";
|
||||||
|
|
||||||
|
static bool firstCall = true;
|
||||||
|
if (firstCall)
|
||||||
|
{
|
||||||
|
ShaderBuilder::init();
|
||||||
|
firstCall = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
ShaderBuilder builder;
|
||||||
|
builder.setRayGenShader(code);
|
||||||
|
shaderRayGen = builder.create(device.get());
|
||||||
|
}
|
||||||
|
|
|
@ -18,6 +18,7 @@ private:
|
||||||
void CreateVertexAndIndexBuffers();
|
void CreateVertexAndIndexBuffers();
|
||||||
void CreateBottomLevelAccelerationStructure();
|
void CreateBottomLevelAccelerationStructure();
|
||||||
void CreateTopLevelAccelerationStructure();
|
void CreateTopLevelAccelerationStructure();
|
||||||
|
void CreateShaders();
|
||||||
|
|
||||||
void RaytraceProbeSample(LightProbeSample* probe);
|
void RaytraceProbeSample(LightProbeSample* probe);
|
||||||
void RaytraceSurfaceSample(Surface* surface, int x, int y);
|
void RaytraceSurfaceSample(Surface* surface, int x, int y);
|
||||||
|
@ -50,6 +51,8 @@ private:
|
||||||
std::unique_ptr<VulkanBuffer> tlAccelStructBuffer;
|
std::unique_ptr<VulkanBuffer> tlAccelStructBuffer;
|
||||||
std::unique_ptr<VulkanAccelerationStructure> tlAccelStruct;
|
std::unique_ptr<VulkanAccelerationStructure> tlAccelStruct;
|
||||||
|
|
||||||
|
std::unique_ptr<VulkanShader> shaderRayGen;
|
||||||
|
|
||||||
std::unique_ptr<VulkanCommandPool> cmdpool;
|
std::unique_ptr<VulkanCommandPool> cmdpool;
|
||||||
std::unique_ptr<VulkanCommandBuffer> cmdbuffer;
|
std::unique_ptr<VulkanCommandBuffer> cmdbuffer;
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in a new issue