Glsl WebGl是否支持图像单位

Glsl WebGl是否支持图像单位,glsl,webgl,Glsl,Webgl,我正在研究快速glsl模糊效果,无论大小都能快速渲染。这让我想到了如何使用方块模糊来模拟高斯模糊 由于可以使用加权平均值,因此对于大内核,框模糊速度更快。但是,要使用加权平均值,需要分别从纹理中读取像素 我想那是不可能的!直到我在第7行的片段着色器中看到这行代码: imageStore( uTex1, ivec2( x, y ), vec4( colourSum * recKernelSize, 1.0 ) 我查看了openGL wiki,发现它描述了如何使用像2d数组这样的图像,您可以在其

我正在研究快速glsl模糊效果,无论大小都能快速渲染。这让我想到了如何使用方块模糊来模拟高斯模糊

由于可以使用加权平均值,因此对于大内核,框模糊速度更快。但是,要使用加权平均值,需要分别从纹理中读取像素

我想那是不可能的!直到我在第7行的片段着色器中看到这行代码:

imageStore( uTex1, ivec2( x, y ), vec4( colourSum * recKernelSize, 1.0 ) 
我查看了openGL wiki,发现它描述了如何使用像2d数组这样的图像,您可以在其中任意访问像素

但是,设置此设置时,需要使用图像单位而不是纹理单位。我试图为webgl找到关于这个的文档,但即使是谷歌也没有给我留下任何东西

那么,在webgl中可以使用图像单位吗?如果可以,我将如何设置图像单位


编辑:还可以将现有纹理转换为图像单位吗

图像加载/存储不适用于WebGL 2.0,但您不需要图像加载/存储就可以获取特定纹理的数据
texelFetch
而不是通过浮点纹理坐标,这可用于WebGL 2.0

但实际上,从整数坐标提取
纹理并不难,只要使用
最近的
过滤,并通过
统一的
为着色器提供纹理分辨率


供参考:

还可以将现有纹理转换为图像单位吗


纹理包含一个或多个图像。图像单元是一个索引位置,您可以将纹理中存储的图像之一绑定到该位置。您只是说“访问此纹理的mipmap layer X作为图像”;没有“转换”发生。

这可能已经被回答了至少12次,但我太懒了,S.O.搜索不好,所以

在WebGL1中,您可以通过将“过滤”设置为“最近”并使用

vec4 color = texture2D(someSampler, (pixelCoord + 0.5) / textureResolution);
例如,如果你的纹理是75x35,你想查找像素15,31,那么

vec2 textureResolution = vec2(75, 35);
vec2 pixelCoord = vec2(15, 31);
vec4 color = texture2D(someSampler, (pixelCoord + 0.5) / textureResolution);
当然,通常您可能会将
textureResolution
制作成一个统一的,这样您就可以根据一些公式或数据将其传入并
pixelCoord

在WebGL2中,您可以使用
texelFetch
,它采用整数坐标和mip级别

ivec2 pixelCoord = ivec2(15, 31);
int mipLevel = 0;
vec4 color = texelFetch(someSampler, pixelCoord, mipLevel);

至于3x3内核的模糊处理。

@Nicolas注意到,我编辑了我的问题以反映这一点谢谢!这很有帮助,是的,我知道从纹理中提取单个纹理可以通过计算坐标来完成,但是框模糊算法一次处理一个像素。据我所知,这不能用纹理来完成。@YAHsaves:“框模糊算法一次处理一个像素。据我所知,这不能用纹理来完成”。。。为什么不呢?如果内核是7x7,框模糊计算前7个像素的平均值。然后,当它移动到下一个像素时,它将新像素添加到加权值,同时减去最左边的像素。始终在加权平均值中保留7个像素。你怎么能用纹理一次平均7个像素?@YAHsaves:你把一个特定的算法和目标混淆了。7x7盒过滤器通过取离像素最近的7个像素并将它们平均在一起来计算像素值。确切地说,你是如何做到这一点的,与你试图做到的截然不同。你引用的算法对于着色器来说不是一个有用的算法,但这不应该阻止你找到一个更适合着色器的算法。是的,很好的一点,不幸的是,这是我能找到的唯一一个不会随着模糊大小的增加而增加复杂性的算法。我在上面的链接中看到了这个算法在glsl中的实现,这就是为什么我试图理解它如何在webgl中工作。我想我会继续找的,谢谢你的帮助!感谢Gman为您添加的输入!我试图在上搜索这个问题,所以在提问之前,很抱歉,我找不到答案。问题是,您提到使用texture2D使用WebGL1对单个像素进行采样。这会像采样整个纹理一样慢吗?假设我想实现我链接到的框模糊算法,其中每个像素需要单独引用。我会调用texture2D超过200万次,但只针对一个像素。我猜这会算作200万次纹理调用,让一切都变得一团糟?