【问题标题】:OpenGL early depth test not workingOpenGL早期深度测试不起作用
【发布时间】:2016-05-18 19:05:44
【问题描述】:

这是我的片段着色器:

#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 指令会阻止这种行为。这不仅仅是一种优化,因为着色器中有原子存储,应该只针对未遮挡的像素运行。

【问题讨论】:

  • 你遇到过这些limitations吗?
  • @Joel:您是否检查过深度测试实际上已启用,并且存在深度缓冲区?

标签: opengl graphics glsl gpu opengl-4


【解决方案1】:

我的三角形完全覆盖了屏幕。预期的行为是 num_fragments 等于像素数 (640*480 = 307200),这适用于单层三角形。

不,这不是预期的行为。

早期深度测试并不是魔法。它们不以任何方式保证随机分类的三角形将具有零透支。他们只是在执行片段着色器之前强制片段测试发生。所有这些都是确保测试通过或失败。因此,片段着色器只会对已通过的片段执行。

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

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

这不仅仅是一种优化,因为着色器中有原子存储,应该只针对未遮挡的像素运行。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-09
    • 2013-07-27
    • 1970-01-01
    • 1970-01-01
    • 2020-12-29
    • 2018-07-01
    • 1970-01-01
    相关资源
    最近更新 更多