问题标签 [image-unit]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
717 浏览

opengl - GLSL 4.2 - 如何检索图像的大小?

在 GLSL 4.2 中,可以使用image2D带有 imageLoad 和 imageStore 函数的数据类型。这些函数ivec用于确定要写入/读取的像素。为了计算正确ivec,我需要知道图像的大小。但是我该如何找回呢?

textureSize()似乎只适用于采样器,不适用于图像。

怎么做?

0 投票
1 回答
2050 浏览

opengl - OpenGL 4.2 使用与图像和采样器相同的纹理

使用与 image2D 和 sampler2D 相同的纹理是否合法(并且定义明确)?

目前我在 GLSL 着色器中使用 imageLoad() 和 imageStore() 从 image2D 写入和加载。但是,我也想从纹理的某些 mipmap 级别读取(而不是写入),但这不受 imageLoad 支持(我想我必须将每个 mipMap 级别绑定为单独的 image2D,但可用图像单元的数量是相当有限)。所以我的问题是,是否可以将我用作 imageStore() 的 image2D 的相同纹理也用作与 textureLod() 一起使用的 sampler2D?

0 投票
2 回答
1156 浏览

opengl - GLSL image2D 抗锯齿

是否可以为 image2D 设置 MSAA 采样?它可以在OpenGL中作为texture2D的多重采样类型吗?我写的第一遍不是渲染缓冲区(或纹理),而是图像,我存储了相同图元的多个像素副本但偏移量不同。然后我将它blit到主窗口帧缓冲区。输出具有很强的混叠和我想知道是否有可能第一次使用 MSAA。

0 投票
0 回答
471 浏览

opengl - 从 image2DArray 访问 image2D

我问的可能是一个简单的问题。我有一个 image2D 纹理的纹理数组 (GL_TEXTURE_2D_ARRAY)。我通过 image2DArray 访问片段着色器中的数组。如何访问数组的图像?imageLoad() 有层号参数?我已经在这里这里阅读,但未能弄清楚它是如何完成的。

问题是,如果我这样访问它:

也就是说,纹理坐标的第三个数字是纹理层索引。我将纹理的输出放到屏幕上,但它变成静态(不随凸轮移动而移动)并移位。

更新:

好的,这是我的错。我引用了错误的纹理对象。是的,imageLoad 中 ivec3 的第三个坐标应该以纹理数组层索引为目标。

0 投票
2 回答
1045 浏览

opengl - 在 GLSL 中的图像单元上设置只读/只写的性能影响

glBindImageTexture(), access可以是GL_READ_ONLY, GL_WRITE_ONLY, 或GL_READ_WRITE. 我假设这些应该与GLSL 中图像单元(例如or )上的readonlyandwriteonly限定符匹配。image2DimageBuffer

设置只读或只写(2013,NVIDIA 319.49 驱动程序)时,我没有注意到任何区别。当然,我可能不会做任何会导致减速的事情,因此看不到任何改进。当前的 GL 实现也可以简单地忽略这些限定符。

  • 在什么情况下 GL 实现可以使用只读/只写,为什么它们存在?

我想到了缓存一致性,但coherent/volatile限定词是否已经涵盖了这一点?我用过这些,它们似乎有效。

  • 有没有人在使用只读/只写时经历过性能或结果的差异,它们有多重要?

如果已经有好几年了,不要害怕回复,我很想知道,我相信其他人也是。

0 投票
1 回答
1623 浏览

opengl - GLSL 原子图像访问

我的另一篇文章打算收集有关 GLSL 自旋锁种类的一般信息,但不幸的是,它没有任何结果,也没有解决我的问题。因此,一个具体的问题。我将我的问题简化为一个最小的示例,如下所示:

微不足道的问题使屏幕大小的锁纹理和颜色纹理。在第一阶段,颜色都设置为零(着色器 1)。在第二步中,绘制了两个三角形,几何着色器将其翻了四倍并略微偏移(着色器 2)。片段着色器以原子方式增加纹理的颜色。在第三阶段,颜色被可视化(着色器 3)。

着色器 1:

着色器 2:

着色器 3:

主循环:

  1. 启用着色器 1
  2. 渲染全屏四边形
  3. glMemoryBarrier(GL_ALL_BARRIER_BITS);

  4. 启用着色器 2

  5. 渲染两个小三角形
  6. glMemoryBarrier(GL_ALL_BARRIER_BITS);

  7. 启用着色器 3

  8. 渲染全屏四边形

请注意,在第 3 步和第 6 步中,我 [认为我] 可以使用 GL_SHADER_IMAGE_ACCESS_BARRIER_BIT。以防万一,我是保守的。

可视化的颜色随时间抖动,并且大多相当小。这表明原子性没有发生。有人可以理智地检查这个程序吗?我错过了什么吗?

编辑:从这个页面,我发现使用discard可以使图像加载/存储在片段中未定义。我删除了丢弃物,但问题仍然存在。我还发现layout(early_fragment_tests) in;,它强制进行早期片段测试(它也没有帮助)。

0 投票
1 回答
1770 浏览

opengl - 如何在 GLSL 中获取图像单元(例如 image2D)的大小,就像 textureSize 一样

textureSize是一个方便的函数,可以在着色器中获取纹理尺寸,而无需将它们作为制服手动传递。

图像单元是否有类似的 API ?

0 投票
1 回答
402 浏览

c++ - 在片段着色器 OpenGL 中写入多个 3D 纹理

我有一个 3D 纹理,我在其中写入数据并以这种方式将其用作片段着色器中的体素:

并且纹理是这样定义的

然后当我必须使用它时

现在我的问题是我想要一个 mipmapped 版本而不使用 opengl 函数,因为我注意到它非常慢。所以我正在考虑同时在所有级别写入 3D 纹理,例如,最大分辨率为 512^3,当我在该 3dtex 中写入 1 voxel VALUE 时,我还为 256^3 写入 0.125*VALUE voxel 和 0.015625*VALUE 用于 126^3 等。由于我使用 imageStore,它使用原子性,所有值都将被写入并使用这些权重我会自动获得平均值(不完全像插值,但我可能会得到一个令人愉快的结果反正)。所以我的问题是,拥有多个 3dtexture 并同时写入所有这些的最佳方法是什么?

0 投票
0 回答
200 浏览

opengl - 使用 image_load_store 写入单个颜色通道

image_load_store 扩展提供加载/存储功能,*vec4只能访问。例如,如果我有layout(rgba32f) uniform image2D myimage;,似乎我必须一次写入整个像素:

如果我只想将红色通道设置为1,我需要这样做:

这在额外的读取中引入了相当多的开销。

有没有我可以用来只写入特定频道的机制?

类似的东西glColorMask,或者可能将数据绑定到不同的格式,例如更大的GL_R32F image2DimageBuffer?如果是这样,有哪些开销影响(例如转换/传输/缓存问题)?

0 投票
1 回答
768 浏览

opengl - OpenGL Image Load/Store 24-bit RGB images

It looks like glBindImageTexture does not have an image format for 24-bit RGB (3 8-bit channels) images. My texture has an internal format of the type GL_RGB8 (a 24-bit RGB image). Unfortunately I cannot easily change the type of my texture that I'm binding to the image unit at runtime -- is it possible to use a different image format with imageLoad and still access the 24-bit RGB data?