我正在尝试将多采样深度缓冲区的每个样本读取为存储图像,该存储图像仅由我的pre-z传递生成。
但是,这是我面前的两个基本问题:
Image2DMS prez;
多次采样的
由于每个纹素样本的数量是动态设置的,我不能只使用像#define SAMPLE_PER_TEXAL 16
这样的宏来声明它。
我查看了glsl4.5规范,但未找到任何可以获取该数字的API。在着色器中获得该数字真的可行吗?loadImage(Image2DMS img, ivec2 P, int sample);
似乎对我有帮助。但是,在规范中称为“样本编号”的thrid参数int sample
仍未在整个规范中定义。OpenGL 4.5 / ARB_shader_texture_image_samples允许您通过函数textureSamples
查询GLSL纹理中的样本数。您还可以通过制服将其传递到着色器。
当传递多重采样采样器类型时,imageLoad
将采用另一个整数参数来指定要从中读取的样本。所以2D多重采样纹理的功能如下所示:
gvec imageLoad(gimage2DMS image, ivec2 P, int sample);
即使没有可以为您提供样本计数的GLSL函数,因为您知道它是客户端的,您可以将它作为一个统一传递给着色器。
对于第二个问题 - 根据Wiki:
访问多重采样纹理时,访问函数有另一个参数,一个定义要读取或写入的样本索引的int。
所以,是的,使用loadImage(Image2DMS img, ivec2 P, int sample)
重载应该“正常工作”sample = 0,1,2,...直到图像中的样本数量。