使用片段着色器计算纹素

时间:2010-04-13 10:18:57

标签: c++ opengl textures shader fragment

我使用片段着色器生成了两个纹理。我希望能够计算每个纹理中高于某种颜色强度的纹素数量。我的问题是如何做到这一点?我最初的想法是在生成纹理之前使用片段着色器计算这些纹素。但是,这需要某种全球反击。我无法使用遮挡查询,因为纹理是从其他纹理创建的。我正在使用OpenGL 2.1。任何想法都赞赏。
谢谢

3 个答案:

答案 0 :(得分:2)

感谢您的想法,
我发现一种简单的方法,我认为是最有效的。我最初认为遮挡查询只能用于几何,但它们也可以用于纹理。

  1. 启用遮挡查询
  2. 使用片段着色器渲染图像,并在下方需要discard个纹素 颜色强度
  3. 检索从查询
  4. 传递绘图测试的纹素数量

答案 1 :(得分:0)

你总是可以在帧缓冲区上运行一个像素着色器,它将阈值以上的所有像素设置为白色,其余像素设置为黑色。然后抓取帧缓冲区的图片并计算白色像素的数量......

我认为你不需要每一帧都这样做。如果你是,你可能不得不改变你的要求......

答案 2 :(得分:0)

我使用顶点和片段着色器完成了这项工作。

我为纹理中的每个像素声明一个点顶点并渲染它们。

我声明一个1D的屏幕外渲染纹理,它是我想要的桶数的长度。你可以制作这个1桶,但是当每个片段等待写入同一个像素时,它会减慢你的速度。我发现32通常对我来说效果很好。

将混合模式设置为添加剂。

在顶点着色器中,我根据桶的数量修改gl_VertexID,并设置范围在-1< - > 1之间。

对每个顶点(实际上等于每个像素)的纹理进行采样,并将gl_Color设置为白色表示有效像素,将黑色表示为非(基本上为1或0)。

对1D纹理进行回读并总结值。这将是像素数。

我过去做过的第二种方法是第一次传递到与输入大小相同的屏幕外纹理,并将输入分类为1或0.接下来,渲染到一半的纹理宽度和高度以及样本4次添加和写入。继续这样做,直到达到1x1并读回值。