Joe*_*oel 4 opengl graphics gpu glsl opengl-4
这是我的片段着色器:
#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(...);
}
Run Code Online (Sandbox Code Playgroud)
我的三角形完全覆盖了屏幕。预期的行为是num_fragments等于像素数 (640*480 = 307200),这是单层三角形。但是,当我在现有三角形后面添加一个三角形时,num_fragments 会变成一个更高的值,就像正在为被遮挡的三角形执行片段着色器一样。
为什么是这样?我认为 early_fragment_tests 指令会阻止这种行为。这不仅仅是一种优化,因为着色器中有原子存储,应该只为未遮挡的像素运行。
我的三角形完全覆盖了屏幕。预期的行为是 num_fragments 等于像素数 (640*480 = 307200),这适用于单层三角形。
不,这不是预期的行为。
早期的深度测试并不神奇。它们不以任何方式保证随机分类的三角形将具有零透支。它们只是在执行片段着色器之前强制执行片段测试。所有这些都是确保测试通过或失败。因此,片段着色器只会对已通过的片段执行。
过度绘制与早期深度测试无关。Overdraw 是关于你正在渲染的三角形的顺序。如果将它们从前到后排序,则透支为零。如果您将它们从后到前排序,那么您将获得最大可能的透支。
无论片段测试是否在片段着色器之前发生,都会发生这种情况。
这不仅仅是一种优化,因为着色器中有原子存储,应该只为未遮挡的像素运行。
做到这一点的唯一方法是进行仅限深度的预通过。您必须将场景渲染到深度缓冲区(没有片段着色器)。然后,当您真实地渲染场景时,唯一通过深度测试的片段将是可见的片段。
| 归档时间: |
|
| 查看次数: |
1074 次 |
| 最近记录: |