Enabling/Disabling DEPTH_TEST 是否影响 imageAtomicExchange、imageStore?
Does Enabling/Disabling the DEPTH_TEST affect the imageAtomicExchange, imageStore?
我正在尝试实现顺序独立透明性。在收集碎片期间,以下代码将是 运行:
uint index = atomicCounterIncrement(list_counter);
uint old_head = imageAtomicExchange(head_pointer_image, ivec2(gl_FragCoord.xy), uint(index));
item.x = old_head;
item.y = packUnorm4x8(frag_color);
item.z = floatBitsToUint(gl_FragCoord.z);
item.w = packUnorm4x8(frag_specularity);
imageStore(list_buffer, int(index), item);
正如预期的那样,片段着色器将 运行 在所有正在渲染的片段上。因此,disabling/enabling 将在 运行 片段着色器之后进行的深度测试不会影响最终的 head_pointer_image
和 list_buffer
。
但是通过启用和禁用深度测试,我得到以下结果:
DEPTH_TEST Enabled
DEPTH_TEST Disabled
我想知道深度测试是否影响 head_pointer_image
和 list_buffer
?或 OpenGL 内部优化正在以这种方式进行?
在OpenGL中,深度测试也可以在片段着色器执行之前完成。这称为 "Early Fragment Testing" 并且可以作为优化启用(或者在 OpenGL > 4.2 的情况下可以由 ARB_shader_image_load_store 扩展控制)。
用户可以通过指定
启用早期片段测试
layout(early_fragment_tests) in;
但我认为无法以某种方式禁用它。在您的情况下,最好的办法是像您已经做的那样禁用深度测试。有关详细信息,请查看 here.
我正在尝试实现顺序独立透明性。在收集碎片期间,以下代码将是 运行:
uint index = atomicCounterIncrement(list_counter);
uint old_head = imageAtomicExchange(head_pointer_image, ivec2(gl_FragCoord.xy), uint(index));
item.x = old_head;
item.y = packUnorm4x8(frag_color);
item.z = floatBitsToUint(gl_FragCoord.z);
item.w = packUnorm4x8(frag_specularity);
imageStore(list_buffer, int(index), item);
正如预期的那样,片段着色器将 运行 在所有正在渲染的片段上。因此,disabling/enabling 将在 运行 片段着色器之后进行的深度测试不会影响最终的 head_pointer_image
和 list_buffer
。
但是通过启用和禁用深度测试,我得到以下结果:
我想知道深度测试是否影响 head_pointer_image
和 list_buffer
?或 OpenGL 内部优化正在以这种方式进行?
在OpenGL中,深度测试也可以在片段着色器执行之前完成。这称为 "Early Fragment Testing" 并且可以作为优化启用(或者在 OpenGL > 4.2 的情况下可以由 ARB_shader_image_load_store 扩展控制)。
用户可以通过指定
启用早期片段测试layout(early_fragment_tests) in;
但我认为无法以某种方式禁用它。在您的情况下,最好的办法是像您已经做的那样禁用深度测试。有关详细信息,请查看 here.