启用/禁用DEPTH_TEST是否会影响imageAtomicExchange,imageStore?

时间:2016-02-16 20:36:59

标签: opengl fragment-shader opengl-4

我正在尝试实现订单独立透明度。在收集片段期间,将运行以下代码:

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);

正如预期的那样,片段着色器将在渲染的所有片段上运行。因此,在运行片段着色器后禁用/启用深度测试不会影响最终的head_pointer_imagelist_buffer

但是通过启用和禁用深度测试,我得到以下结果:

DEPTH_TEST enabledDEPTH_TEST Enabled

DEPTH_TEST disabledDEPTH_TEST Disabled

我想知道深度测试是否会影响head_pointer_imagelist_buffer?或OpenGL内部优化是以这种方式进行的吗?

1 个答案:

答案 0 :(得分:2)

在OpenGL中,深度测试也可以在片段着色器执行之前完成。这称为“早期片段测试”,可以作为优化启用(或者在OpenGL> 4.2的情况下可以由ARB_shader_image_load_store扩展名控制)。

用户可以通过指定

来启用早期片段测试
layout(early_fragment_tests) in;

但我认为不可能以某种方式禁用它。在您的情况下,最好的办法是禁用深度测试。有关详细信息,请查看here