我正在尝试将多采样深度缓冲区的每个样本读取为存储图像,该图像只是由我的pre-z传递生成的。
但是,这是我面前的两个基本问题:
图像的每个像素中有多少个样本?
当然,我可以在应用程序中获得此数字,因为这是我之前创建多采样深度缓冲区时指定的数字。
但是没有在着色器中指定数字。我所知道的是,缓冲区被Image2DMS prez;
由于每个纹理像素样本的数量是动态设置的,所以我不能仅使用#define SAMPLE_PER_TEXAL 16
之类的宏来声明它。
我已经查看了glsl4.5规范,但未找到任何可以获取该编号的API。在着色器中获取该数字确实可行吗?
如何访问图像的指定样本?
API loadImage(Image2DMS img, ivec2 P, int sample);
可能对我有帮助。
但是,在整个规范中仍未定义第三参数int sample
(在规范中称为“样本编号”)。
答案 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,...直至图像中的样本数量。