diff --git a/projects/voxelization/resources/shaders/voxel.inc b/projects/voxelization/resources/shaders/voxel.inc index 5e56878aca5a13b9ac41949ce89bf8709429382a..d2b4400235817e3be1739dc46857ab42f260ebf7 100644 --- a/projects/voxelization/resources/shaders/voxel.inc +++ b/projects/voxelization/resources/shaders/voxel.inc @@ -5,4 +5,21 @@ struct VoxelInfo{ uint flattenVoxelUVToIndex(ivec3 UV, ivec3 voxelImageSize){ return UV.x + UV.y * voxelImageSize.x + UV.z * voxelImageSize.x* voxelImageSize.y; +} + +uint packVoxelInfo(vec3 color){ + uint opaqueBit = 1 << 31; + uint redBits = uint(color.r * 255); + uint greenBits = uint(color.g * 255) << 8; + uint blueBits = uint(color.b * 255) << 16; + return opaqueBit | redBits | greenBits | blueBits; +} + +vec4 unpackVoxelInfo(uint packed){ + vec4 rgba; + rgba.r = (packed >> 0 & 0x000000FF) / 255.f; + rgba.g = (packed >> 8 & 0x000000FF) / 255.f; + rgba.b = (packed >> 16 & 0x000000FF) / 255.f; + rgba.a = packed >> 31; + return rgba; } \ No newline at end of file diff --git a/projects/voxelization/resources/shaders/voxelBufferToImage.comp b/projects/voxelization/resources/shaders/voxelBufferToImage.comp index 4c5d73c05ab95a979fdd78e852e9c60c7820ac2a..20c56e31b0f8b6e6503bdaf347ea730bcbc87f01 100644 --- a/projects/voxelization/resources/shaders/voxelBufferToImage.comp +++ b/projects/voxelization/resources/shaders/voxelBufferToImage.comp @@ -2,11 +2,11 @@ #extension GL_GOOGLE_include_directive : enable #include "voxel.inc" -layout(set=0, binding=0) buffer voxelBuffer{ +layout(set=0, binding=0, std430) buffer voxelBuffer{ uint isFilled[]; }; -layout(set=0, binding=1, r8) uniform image3D voxelImage; +layout(set=0, binding=1, rgba16f) uniform image3D voxelImage; layout(local_size_x = 4, local_size_y = 4, local_size_z = 4) in; @@ -18,5 +18,7 @@ void main(){ } ivec3 UV = ivec3(gl_GlobalInvocationID); uint flatIndex = flattenVoxelUVToIndex(UV, voxelImageSize); - imageStore(voxelImage, UV, vec4(isFilled[flatIndex], vec3(0))); + + vec4 color = unpackVoxelInfo(isFilled[flatIndex]); + imageStore(voxelImage, UV, vec4(color)); } \ No newline at end of file diff --git a/projects/voxelization/resources/shaders/voxelVisualisation.frag b/projects/voxelization/resources/shaders/voxelVisualisation.frag index e1a363c799a6ede52f07df436653fad3dc455164..0b02beb7e848ab20cda4b012f77d1fa664b6ab53 100644 --- a/projects/voxelization/resources/shaders/voxelVisualisation.frag +++ b/projects/voxelization/resources/shaders/voxelVisualisation.frag @@ -1,9 +1,9 @@ #version 450 #extension GL_ARB_separate_shader_objects : enable -layout(location=0) in vec3 inColor; +layout(location=0) in vec3 passColorToFrag; layout(location=0) out vec3 outColor; void main() { - outColor = inColor; + outColor = passColorToFrag; } \ No newline at end of file diff --git a/projects/voxelization/resources/shaders/voxelVisualisation.geom b/projects/voxelization/resources/shaders/voxelVisualisation.geom index 4327182828352a06aafeae7d8f4af40831feb888..e98076fcc83a69a903df454cb00267da84e3f223 100644 --- a/projects/voxelization/resources/shaders/voxelVisualisation.geom +++ b/projects/voxelization/resources/shaders/voxelVisualisation.geom @@ -9,95 +9,96 @@ layout( push_constant ) uniform constants{ }; layout(location = 0) in float passCubeHalf[1]; +layout(location = 1) in vec3 passColorToGeom[1]; -layout(location = 0) out vec3 passColor; + +layout(location = 0) out vec3 passColorToFrag; void main() { float cubeHalf = passCubeHalf[0]; // right gl_Position = viewProjection * vec4(gl_in[0].gl_Position.xyz + cubeHalf * vec3(1, 1, 1), 1); - passColor = vec3(1, 0, 0); + passColorToFrag = passColorToGeom[0]; EmitVertex(); gl_Position = viewProjection * vec4(gl_in[0].gl_Position.xyz + cubeHalf * vec3(1, 1, -1), 1); - passColor = vec3(1, 0, 0); + passColorToFrag = passColorToGeom[0]; EmitVertex(); gl_Position = viewProjection * vec4(gl_in[0].gl_Position.xyz + cubeHalf * vec3(1, -1, 1), 1); - passColor = vec3(1, 0, 0); + passColorToFrag = passColorToGeom[0]; EmitVertex(); gl_Position = viewProjection * vec4(gl_in[0].gl_Position.xyz + cubeHalf * vec3(1, -1, -1), 1); - passColor = vec3(1, 0, 0); + passColorToFrag = passColorToGeom[0]; EmitVertex(); EndPrimitive(); // left gl_Position = viewProjection * vec4(gl_in[0].gl_Position.xyz + cubeHalf * vec3(-1, 1, 1), 1); - passColor = vec3(1, 0, 0); + passColorToFrag = passColorToGeom[0]; EmitVertex(); gl_Position = viewProjection * vec4(gl_in[0].gl_Position.xyz + cubeHalf * vec3(-1, 1, -1), 1); - passColor = vec3(1, 0, 0); + passColorToFrag = passColorToGeom[0]; EmitVertex(); gl_Position = viewProjection * vec4(gl_in[0].gl_Position.xyz + cubeHalf * vec3(-1, -1, 1), 1); - passColor = vec3(1, 0, 0); + passColorToFrag = passColorToGeom[0]; EmitVertex(); gl_Position = viewProjection * vec4(gl_in[0].gl_Position.xyz + cubeHalf * vec3(-1, -1, -1), 1); - passColor = vec3(1, 0, 0); + passColorToFrag = passColorToGeom[0]; EmitVertex(); EndPrimitive(); // back gl_Position = viewProjection * vec4(gl_in[0].gl_Position.xyz + cubeHalf * vec3(1, 1, -1), 1); - passColor = vec3(0, 0, 1); + passColorToFrag = passColorToGeom[0]; EmitVertex(); gl_Position = viewProjection * vec4(gl_in[0].gl_Position.xyz + cubeHalf * vec3(1, -1, -1), 1); - passColor = vec3(0, 0, 1); + passColorToFrag = passColorToGeom[0]; EmitVertex(); gl_Position = viewProjection * vec4(gl_in[0].gl_Position.xyz + cubeHalf * vec3(-1, 1, -1), 1); - passColor = vec3(0, 0, 1); + passColorToFrag = passColorToGeom[0]; EmitVertex(); gl_Position = viewProjection * vec4(gl_in[0].gl_Position.xyz + cubeHalf * vec3(-1, -1, -1), 1); - passColor = vec3(0, 0, 1); + passColorToFrag = passColorToGeom[0]; EmitVertex(); EndPrimitive(); // front gl_Position = viewProjection * vec4(gl_in[0].gl_Position.xyz + cubeHalf * vec3(1, 1, 1), 1); - passColor = vec3(0, 0, 1); + passColorToFrag = passColorToGeom[0]; EmitVertex(); gl_Position = viewProjection * vec4(gl_in[0].gl_Position.xyz + cubeHalf * vec3(1, -1, 1), 1); - passColor = vec3(0, 0, 1); + passColorToFrag = passColorToGeom[0]; EmitVertex(); gl_Position = viewProjection * vec4(gl_in[0].gl_Position.xyz + cubeHalf * vec3(-1, 1, 1), 1); - passColor = vec3(0, 0, 1); + passColorToFrag = passColorToGeom[0]; EmitVertex(); gl_Position = viewProjection * vec4(gl_in[0].gl_Position.xyz + cubeHalf * vec3(-1, -1, 1), 1); - passColor = vec3(0, 0, 1); + passColorToFrag = passColorToGeom[0]; EmitVertex(); EndPrimitive(); // bot gl_Position = viewProjection * vec4(gl_in[0].gl_Position.xyz + cubeHalf * vec3(1, 1, 1), 1); - passColor = vec3(0, 1, 0); + passColorToFrag = passColorToGeom[0]; EmitVertex(); gl_Position = viewProjection * vec4(gl_in[0].gl_Position.xyz + cubeHalf * vec3(1, 1, -1), 1); - passColor = vec3(0, 1, 0); + passColorToFrag = passColorToGeom[0]; EmitVertex(); gl_Position = viewProjection * vec4(gl_in[0].gl_Position.xyz + cubeHalf * vec3(-1, 1, 1), 1); - passColor = vec3(0, 1, 0); + passColorToFrag = passColorToGeom[0]; EmitVertex(); gl_Position = viewProjection * vec4(gl_in[0].gl_Position.xyz + cubeHalf * vec3(-1, 1, -1), 1); - passColor = vec3(0, 1, 0); - passColor = vec3(0, 1, 0); + passColorToFrag = passColorToGeom[0]; + passColorToFrag = passColorToGeom[0]; EmitVertex(); EndPrimitive(); // top gl_Position = viewProjection * vec4(gl_in[0].gl_Position.xyz + cubeHalf * vec3(1, -1, 1), 1); - passColor = vec3(0, 1, 0); + passColorToFrag = passColorToGeom[0]; EmitVertex(); gl_Position = viewProjection * vec4(gl_in[0].gl_Position.xyz + cubeHalf * vec3(1, -1, -1), 1); - passColor = vec3(0, 1, 0); + passColorToFrag = passColorToGeom[0]; EmitVertex(); gl_Position = viewProjection * vec4(gl_in[0].gl_Position.xyz + cubeHalf * vec3(-1, -1, 1), 1); - passColor = vec3(0, 1, 0); + passColorToFrag = passColorToGeom[0]; EmitVertex(); gl_Position = viewProjection * vec4(gl_in[0].gl_Position.xyz + cubeHalf * vec3(-1, -1, -1), 1); - passColor = vec3(0, 1, 0); - passColor = vec3(0, 1, 0); + passColorToFrag = passColorToGeom[0]; EmitVertex(); EndPrimitive(); } \ No newline at end of file diff --git a/projects/voxelization/resources/shaders/voxelVisualisation.vert b/projects/voxelization/resources/shaders/voxelVisualisation.vert index 0b1bb57e1b37348e877281af7e09343a4b348dd1..8377143f4f4bbf351d3251df9724d37e1747a4dc 100644 --- a/projects/voxelization/resources/shaders/voxelVisualisation.vert +++ b/projects/voxelization/resources/shaders/voxelVisualisation.vert @@ -5,12 +5,13 @@ #include "voxel.inc" layout(location = 0) out float passCubeHalf; +layout(location = 1) out vec3 passColorToGeom; layout( push_constant ) uniform constants{ mat4 viewProjection; }; -layout(set=0, binding=0, r8) uniform image3D voxelImage; +layout(set=0, binding=0, rgba16f) uniform image3D voxelImage; layout(set=0, binding=1) uniform voxelizationInfo{ VoxelInfo voxelInfo; }; @@ -27,7 +28,9 @@ void main() { vec3 position = (vec3(x, y, z) / voxelResolution - 0.5) * voxelInfo.extent + passCubeHalf + voxelInfo.offset; gl_Position = vec4(position, 1.0); - if(imageLoad(voxelImage, ivec3(x,y,z)).x == 0){ + vec4 voxelColor = imageLoad(voxelImage, ivec3(x,y,z)); + if(voxelColor.a == 0){ gl_Position.x /= 0; // clip } + passColorToGeom = voxelColor.rgb; } \ No newline at end of file diff --git a/projects/voxelization/resources/shaders/voxelization.frag b/projects/voxelization/resources/shaders/voxelization.frag index 9be9c259d2d57e3cae6f1710b2c650060c2dad40..69e2052cf0f6e979c18b6e7a48102c06b43213b1 100644 --- a/projects/voxelization/resources/shaders/voxelization.frag +++ b/projects/voxelization/resources/shaders/voxelization.frag @@ -6,7 +6,7 @@ layout(location = 0) in vec3 passPos; -layout(set=0, binding=0) buffer voxelizationBuffer{ +layout(set=0, binding=0, std430) buffer voxelizationBuffer{ uint isFilled[]; }; @@ -32,5 +32,7 @@ void main() { return; } uint flatIndex = flattenVoxelUVToIndex(UV, voxelImageSize); - isFilled[flatIndex] = 1; + + vec3 color = vec3(1, 1, 0); + isFilled[flatIndex] = packVoxelInfo(color); } \ No newline at end of file diff --git a/projects/voxelization/src/Voxelization.cpp b/projects/voxelization/src/Voxelization.cpp index 17a9d82d1c881b9c53d6af637d4d6838d1916f34..a5658a3870fb5e6df9811d84076d13f0e618a6a2 100644 --- a/projects/voxelization/src/Voxelization.cpp +++ b/projects/voxelization/src/Voxelization.cpp @@ -65,7 +65,7 @@ const vk::Format voxelizationDummyFormat = vk::Format::eR8Unorm; Voxelization::Voxelization(vkcv::Core* corePtr, const Dependencies& dependencies) : m_corePtr(corePtr), - m_voxelImage(m_corePtr->createImage(vk::Format::eR8Unorm, voxelResolution, voxelResolution, voxelResolution, true)), + m_voxelImage(m_corePtr->createImage(vk::Format::eR16G16B16A16Sfloat, voxelResolution, voxelResolution, voxelResolution, true)), m_dummyRenderTarget(m_corePtr->createImage(voxelizationDummyFormat, voxelResolution, voxelResolution, 1, false, true)), m_voxelInfoBuffer(m_corePtr->createBuffer<VoxelizationInfo>(vkcv::BufferType::UNIFORM, 1)), m_visualisationIndexBuffer(m_corePtr->createBuffer<uint16_t>(vkcv::BufferType::INDEX, voxelCount)),