通读一些有关体素化的代码,我在片段着色器中找到了以下内容:

layout (binding = 0, r32f ) coherent uniform writeonly image3D volumeTexture;

我过去只使用过samplers,以前从未使用过image3D

我已经阅读了有关Sampler变量和Image变量的条目,但我真的不了解Sampler和Image之间的区别,优缺点。

有人可以帮我指点一下吗?找出这两种类型的变量有何区别?何时应该使用另一种变量?

评论

标题引用Image2D,代码和正文引用image3D。是否需要其中之一进行编辑?您要问哪一个?

#1 楼

与采样器不同,imageLoad(在HLSL中为Load)需要纹理像素坐标(整数)。这只会将值加载到该位置。坐标的范围可以是(0,0)到(图像宽度,图像高度)。由于只能提供一个整数,因此不应用采样来混合多个纹理像素之间的混合(例如2D中的双线性)。因此,我认为这是一种便宜的操作。

模糊之类的图像处理算法通常会使用图像负载,以便可以处理离散的纹理像素值。

#2 楼

图像和采样器在许多方面有所不同。与采样器不同,只能使用从(0,0)到(x,y)的整数坐标来寻址图像,其中x和y是图像的宽度和高度。它们支持像texelFetch这样的随机访问读取,并且在访问原始texel时不支持任何过滤。图像最有趣的是它们支持读取和写入访问,在Open GLES中存在局限性,其中可以将图像指定为只读或只写,而在桌面GL中不能同时指定两者,尽管您可以将图像指定为读/写这样您就可以一次读取和写入该图像。

使用采样器,如果您想在其中写入颜色,则必须使用FBO,然后再进行一次遍历以使用该颜色。使用图像,您可以通过写入图像和读取图像来一次完成所有操作,当然,您必须自己处理同步。
图像对于图像处理等非常有用。

#3 楼


图像的创建与纹理相同,但是必须将其作为图像绑定到图像单元。这些等效于“纹理单位”。
使用它们,您可以在某些坐标处使用imageStore/imageLoad或原子操作任意执行读/写/修改操作。与采样器不同,这些
坐标在无符号整数范围内。
它们不必成为帧缓冲区颜色附件的一部分即可写入
。这很有用并简化了一些技术,如将
数据注入到体积纹理中,并用于计算着色器。无需使用带有缓冲区数据上传功能的绘制调用。
对绑定为图像的纹理进行
操作时,没有mipmapping或纹理过滤可用。


评论


$ \ begingroup $
第三个要点有错字吗?我猜它应该说“它们不需要成为帧缓冲区颜色附件的一部分”吗?
$ \ endgroup $
–内森·里德(Nathan Reed)
16 Sep 14'0:46

$ \ begingroup $
是的,您是对的。嗯,很奇怪,我的意思相反-已编辑。
$ \ endgroup $
–narthex
16 Sep 14'9:05