【发布时间】:2014-07-10 01:53:52
【问题描述】:
我试图通过计算几何着色器中的顶点计数来控制片段着色器的行为,这样如果我有一个 1000 个三角形的顶点流,当计数达到 500 时,我为片段着色器设置了一些变化,这表明后者必须切换它的处理。要计算处理的总顶点(或三角形),我在几何着色器中使用原子计数器。我计划首先在顶点着色器中进行,但后来我在某处读到,因为顶点缓存计数器不会在每次顶点调用时增加。但现在看来,在几何着色器中执行此操作也不能精确地执行计数。
在我的几何着色器中,我正在这样做:
layout(triangles) in;
layout (triangle_strip ,max_vertices = 3) out;
layout(binding=0, offset=0) uniform atomic_uint ac;
out flat float isExterior;
void main()
{
memoryBarrier();
uint counter = atomicCounter(ac);
float switcher = 0.0;
if (counter >= exteriorSize)
{
switcher = 2.0;
}
else
{
atomicCounterIncrement(ac);
atomicCounterIncrement(ac);
atomicCounterIncrement(ac);
}
isExterior = switcher;
// here just emitting primitive....
exteriorSize 是一个统一的,包含一个等于数组中顶点数的数字。当我在 CPU 上读出计数器的值时,它从不等于 externalSize。但它几乎比它小 2 倍。是否有顶点缓存在几何阶段也是如此?还是我做错了什么?
基本上我需要告诉片段着色器:“在顶点数 X 开始工作 Y 之后,只要顶点数小于 X 就可以工作 Z”而且我无法从原子计数器中得到确切的 X,即使我将其递增直到达到该限制。
更新:
我怀疑问题出在原子写入同步上。如果我在不同的地方设置 memoryBarrier,计数器值会发生变化。但我仍然无法让它返回等于 externalSize 的确切值。
更新 2:
嗯,我没有弄清楚原子计数器同步的问题,所以我做到了using indirect draw . 就像一个魅力。
【问题讨论】: