我有两个使用片段着色器生成的纹理。我希望能够计算每个纹理中高于某个颜色强度的纹素数量。
如何才能做到这一点?
我最初的想法是在生成纹理之前使用片段着色器计算这些纹素。但是,这将需要某种全局计数器。我不能使用遮挡查询,因为纹理是从其他纹理创建的。我正在使用 OpenGL 2.1。
感谢您的想法,
我找到了一种我认为最有效的简单方法。我最初认为遮挡查询只能与几何一起使用,但它们也可以与纹理一起使用。
discard
低于所需颜色强度的纹素渲染图像我已经使用顶点和片段着色器完成了这项工作。
我为纹理中的每个像素声明一个点顶点并渲染它们。
我声明了一个 1D 的屏幕外渲染纹理,并且是我想要的桶数的长度。您可以制作这 1 个存储桶,但在每个片段等待写入同一像素时它会减慢您的速度。我发现 32 通常对我来说效果很好。
将混合模式设置为加法。
在顶点着色器中,我将 gl_VertexID 修改为桶的数量,并将该范围设置在 -1<->1 之间。
对每个顶点(实际上等于每个像素)的纹理进行采样,并将 gl_Color 设置为白色表示有效像素,黑色表示无效(基本上为 1 或 0)。
对 1D 纹理进行回读并总结这些值。这将是像素数。
我过去做过的第二种方法是对与输入大小相同的屏幕外纹理进行第一次传递,并将输入分类为 1 或 0。接下来,渲染到宽度为一半的纹理,然后高度和样本 4 次相加和写入。继续这样做,直到达到 1x1 并读回该值。
您始终可以在帧缓冲区上运行像素着色器,将阈值以上的所有像素设置为白色,其余像素设置为黑色。然后抓取帧缓冲区的图片并计算白色像素的数量......
我假设您不需要在每一帧都这样做。如果你是,你可能不得不改变你的要求......