我正在尝试实现订单独立透明度。在收集片段期间,将运行以下代码:
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_image
和list_buffer
。
但是通过启用和禁用深度测试,我得到以下结果:
我想知道深度测试是否会影响head_pointer_image
和list_buffer
?或OpenGL内部优化是以这种方式进行的吗?
答案 0 :(得分:2)
在OpenGL中,深度测试也可以在片段着色器执行之前完成。这称为“早期片段测试”,可以作为优化启用(或者在OpenGL> 4.2的情况下可以由ARB_shader_image_load_store扩展名控制)。
用户可以通过指定
来启用早期片段测试layout(early_fragment_tests) in;
但我认为不可能以某种方式禁用它。在您的情况下,最好的办法是禁用深度测试。有关详细信息,请查看here。