gpt4 book ai didi

OpenGL 早期深度测试不起作用

转载 作者:行者123 更新时间:2023-12-02 02:44:45 32 4
gpt4 key购买 nike

这是我的片段着色器:

#version 420 core
#extension GL_ARB_explicit_uniform_location : enable
#extension GL_ARB_shader_storage_buffer_object : require
layout(early_fragment_tests) in;
layout(binding = 4, offset = 0) uniform atomic_uint num_fragments;
// ...
void main(void)
{
atomicCounterIncrement(num_fragments);
frag_color = vec4(1.0, 0.0, 0.0, 0.0);

atomicAdd(...);
}

我的三角形完全覆盖了屏幕。预期行为是 num_fragments 等于单层三角形的像素数 (640*480 = 307200)。但是,当我在现有三角形后面添加一个三角形时,num_fragments 会变为更高的值,就像正在为被遮挡的三角形执行片段着色器一样。

这是为什么呢?我认为 Early_fragment_tests 指令会阻止这种行为。这不仅仅是一种优化,因为着色器中存在原子存储,只能针对未遮挡的像素运行。

最佳答案

My triangles completely cover the screen. The expected behavior is for num_fragments to be equal to the number of pixels (640*480 = 307200), which it is for a single layer of triangles.

不,这不是预期的行为。

早期深度测试并不神奇。它们不以任何方式保证三角形的随机分类将具有零 overdraw 。他们只是在执行片段着色器之前强制进行片段测试。所有这一切都是为了确保测试通过或失败。因此,片段着色器只会对已经通过的片段执行。

Overdraw 与早期深度测试无关。过度绘制与您渲染的三角形的顺序有关。如果您将它们从前到后排序,那么您将获得零 overdraw 。如果您将它们从后到前排序,那么您将获得最大可能的 overdraw 。

无论片段测试是否发生在片段着色器之前,都会发生这种情况。

This isn't just an optimization, because there are atomic stores in the shader that should only be run for un-occluded pixels.

做到这一点的唯一方法是进行仅深度预传递。您必须将场景渲染到深度缓冲区(没有片段着色器)。然后,当您真实渲染场景时,唯一通过深度测试的片段将是可见的片段。

关于OpenGL 早期深度测试不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35281164/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com