如何获得着色器中每个像素拥有的样本数量?

时间:2019-04-17 08:13:40

标签: opengl glsl

我正在尝试将多采样深度缓冲区的每个样本读取为存储图像,该图像只是由我的pre-z传递生成的。

但是,这是我面前的两个基本问题:

  1. 图像的每个像素中有多少个样本?

    当然,我可以在应用程序中获得此数字,因为这是我之前创建多采样深度缓冲区时指定的数字。

    但是没有在着色器中指定数字。我所知道的是,缓冲区被Image2DMS prez;

    多次采样

    由于每个纹理像素样本的数量是动态设置的,所以我不能仅使用#define SAMPLE_PER_TEXAL 16之类的宏来声明它。

    我已经查看了glsl4.5规范,但未找到任何可以获取该编号的API。在着色器中获取该数字确实可行吗?

  2. 如何访问图像的指定样本?

    API loadImage(Image2DMS img, ivec2 P, int sample);可能对我有帮助。 但是,在整个规范中仍未定义第三参数int sample(在规范中称为“样本编号”)。

2 个答案:

答案 0 :(得分:2)

OpenGL 4.5 / ARB_shader_texture_image_samples允许您通过函数textureSamples从GLSL查询纹理中的样本数量。您也可以通过制服将其传递给着色器。

imageLoad在传递多重采样的采样器类型时,将采用一个附加的整数参数,该参数指定要读取的样本。因此,二维多样本纹理的功能应如下所示:

gvec imageLoad(gimage2DMS image, ivec2 P, int sample);

答案 1 :(得分:0)

即使没有GLSL函数也可以为您提供样本计数,因为您知道它是客户端,因此您可以将其作为制服传递给着色器。

对于第二个问题-根据Wiki

  

访问多样本纹理时,访问功能具有   另一个参数,一个int,定义要从中读取的样本索引   或写信。

是的,使用loadImage(Image2DMS img, ivec2 P, int sample)重载应该“正常工作”,并且sample = 0,1,2,...直至图像中的样本数量。