是否可以在 uint32 格式纹理上累积片段编号?
Is it possible to accumulate fragment numbers on a uint32 format texture?
我想计算每个像素上的片段数(禁用深度测试)。我尝试启用混合并设置 glBlendFunc(GL_ONE,GL_ONE)
来累积它们。这适用于绑定到 FBO 的 float32 格式纹理,但我认为 uint32 格式纹理(例如 GL_R32UI)对于此任务更直观。但是,我无法获得预期的行为。似乎每个片段都只是覆盖了纹理。我只是想知道是否有其他方法可以在整数格式纹理上进行累加。
However, I can't get the expected behavior. It seems each fragment just overwrites the texture.
那是因为混合阶段在纯整数帧缓冲区格式上不可用。
but I think a uint32 format texture (e.g. GL_R32UI) is more intuitive for this task.
嗯,是吗? “直觉”在这里意味着什么?首先,GL_R16F
格式可能足以进行合理的透支,并且它会大大减少带宽需求(这似乎是这种通过的限制因素)。
I just wonder if there's other methods to do the accumulation on integer format textures.
我可以看到两种方法,我怀疑它们是否真的更“直观”,但我绝对需要整数结果,你可以试试这些:
根本不使用帧缓冲区,但在渲染过程之后使用 image load/store on an unsigned integer texture in the fragment shader. Ust atomic operations, in particular imageAtomicAdd
to count the number of fragments at each fragment location. Note that if you go that route, your're outside of the GL's automatic synchronization paths, and you'll have to add an exlicit glMemoryBarrier
调用。
您也可以只使用标准 规范化 整数格式,例如 GL_RED8
(或 GL_RED16
)像以前一样使用混合,但是片段着色器输出 1.0/255.0
(或 1.0/65535.0
)。最终出现在帧缓冲区中的数据最终将是整数。如果你在 CPU 上需要这个数据,你可以直接读回来,如果你在 GPU 上需要它,你可以使用 glTextureView
将数据重新解释为一个没有 [=41 的非规范化整数纹理=]步.
我想计算每个像素上的片段数(禁用深度测试)。我尝试启用混合并设置 glBlendFunc(GL_ONE,GL_ONE)
来累积它们。这适用于绑定到 FBO 的 float32 格式纹理,但我认为 uint32 格式纹理(例如 GL_R32UI)对于此任务更直观。但是,我无法获得预期的行为。似乎每个片段都只是覆盖了纹理。我只是想知道是否有其他方法可以在整数格式纹理上进行累加。
However, I can't get the expected behavior. It seems each fragment just overwrites the texture.
那是因为混合阶段在纯整数帧缓冲区格式上不可用。
but I think a uint32 format texture (e.g. GL_R32UI) is more intuitive for this task.
嗯,是吗? “直觉”在这里意味着什么?首先,GL_R16F
格式可能足以进行合理的透支,并且它会大大减少带宽需求(这似乎是这种通过的限制因素)。
I just wonder if there's other methods to do the accumulation on integer format textures.
我可以看到两种方法,我怀疑它们是否真的更“直观”,但我绝对需要整数结果,你可以试试这些:
根本不使用帧缓冲区,但在渲染过程之后使用 image load/store on an unsigned integer texture in the fragment shader. Ust atomic operations, in particular
imageAtomicAdd
to count the number of fragments at each fragment location. Note that if you go that route, your're outside of the GL's automatic synchronization paths, and you'll have to add an exlicitglMemoryBarrier
调用。您也可以只使用标准 规范化 整数格式,例如
GL_RED8
(或GL_RED16
)像以前一样使用混合,但是片段着色器输出1.0/255.0
(或1.0/65535.0
)。最终出现在帧缓冲区中的数据最终将是整数。如果你在 CPU 上需要这个数据,你可以直接读回来,如果你在 GPU 上需要它,你可以使用glTextureView
将数据重新解释为一个没有 [=41 的非规范化整数纹理=]步.