@@ -43,6 +43,8 @@ void main() {
4343}
4444#shader geometry
4545#version 460
46+ #extension GL_NV_geometry_shader_passthrough : enable
47+
4648
4749layout (triangles) in ;
4850layout (triangle_strip, max_vertices = 3 ) out ;
@@ -80,12 +82,15 @@ void main(){
8082
8183#shader fragment
8284#version 460
85+
86+ #define USE_IMG_ATOMIC_OPERATION
87+
8388#extension GL_EXT_ray_tracing : enable
8489#extension GL_EXT_ray_query : enable
85- #extension GL_EXT_shader_atomic_float2 : enable
86- // #extension GL_EXT_shader_16bit_storage : require
90+
91+
92+ #extension GL_EXT_shader_atomic_float2 : require
8793// #extension GL_EXT_gpu_shader5 : require
88- // #extension GL_EXT_shader_explicit_arithmetic_types_float16 : require
8994// #extension GL_EXT_shader_atomic_fp16_vector : require
9095#include light.glsl
9196#include scene.glsl
@@ -95,6 +100,9 @@ void main(){
95100#include raytracing.glsl
96101#include material_defines.glsl
97102
103+
104+
105+
98106layout (location = 0 ) in vec3 _pos;
99107layout (location = 1 ) in vec3 _normal;
100108layout (location = 2 ) in vec2 _uv;
@@ -103,7 +111,11 @@ layout(set = 0, binding = 2) uniform sampler2DArray shadowMap;
103111layout (set = 0 , binding = 3 ) uniform samplerCube irradianceMap;
104112layout (set = 0 , binding = 4 ) uniform accelerationStructureEXT TLAS;
105113layout (set = 0 , binding = 5 ) uniform sampler2D samplerMap;
114+
106115layout (set = 0 , binding = 6 , r32f) uniform image3D voxelImage;
116+ #ifdef USE_IMG_ATOMIC_OPERATION
117+ layout (set = 0 , binding = 7 , r32ui) uniform uimage3D auxVoxelImages[3 ];
118+ #endif
107119
108120layout (set = 1 , binding = 1 ) uniform MaterialUniforms {
109121 vec4 slot1;
@@ -217,9 +229,16 @@ void main() {
217229
218230 vec4 result = g_opacity * vec4 (vec3 (color), 1 );
219231 ivec3 voxelPos = worldSpaceToVoxelSpace(_pos);
220-
221- // imageAtomicMax(voxelImage, voxelPos, 1);
222- // imageAtomicMax(voxelImage, voxelPos, f16vec4(color, 1.0));
232+
233+ #ifdef USE_IMG_ATOMIC_OPERATION
234+ imageAtomicMax(auxVoxelImages[0 ], voxelPos, floatBitsToUint(result.r));
235+ imageAtomicMax(auxVoxelImages[1 ], voxelPos, floatBitsToUint(result.g));
236+ imageAtomicMax(auxVoxelImages[2 ], voxelPos, floatBitsToUint(result.b));
237+ // imageAtomicMax(voxelImage, voxelPos, f16vec4(vec4(result, 1.0)));
238+ // imageStore(voxelImage, voxelPos, vec4(0.0, 0.0, 0.0, 1.0));
239+ imageStore(voxelImage, voxelPos, result);
240+ #else
223241 imageStore(voxelImage, voxelPos, result);
242+ #endif
224243
225244}
0 commit comments