如何获取每个像素在着色器内拥有的样本数?

问题描述 投票:0回答:2

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

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

  1. 图像的每个像素中有多少个样本? 当然,我可以在应用程序中获取此数字,因为这是我之前创建多采样深度缓冲区时指定的。 但是在着色器中未指定该数字。我所知道的是缓冲区是由Image2DMS prez;多次采样的 由于每个纹素样本的数量是动态设置的,我不能只使用像#define SAMPLE_PER_TEXAL 16这样的宏来声明它。 我查看了glsl4.5规范,但未找到任何可以获取该数字的API。在着色器中获得该数字真的可行吗?
  2. 如何访问图像的指定样本? API loadImage(Image2DMS img, ivec2 P, int sample);似乎对我有帮助。但是,在规范中称为“样本编号”的thrid参数int sample仍未在整个规范中定义。
opengl glsl
2个回答
2
投票

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

当传递多重采样采样器类型时,imageLoad将采用另一个整数参数来指定要从中读取的样本。所以2D多重采样纹理的功能如下所示:

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

0
投票

即使没有可以为您提供样本计数的GLSL函数,因为您知道它是客户端的,您可以将它作为一个统一传递给着色器。

对于第二个问题 - 根据Wiki

访问多重采样纹理时,访问函数有另一个参数,一个定义要读取或写入的样本索引的int。

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

© www.soinside.com 2019 - 2024. All rights reserved.