问题标签 [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.
opengl - GLSL 4.2 - 如何检索图像的大小?
在 GLSL 4.2 中,可以使用image2D
带有 imageLoad 和 imageStore 函数的数据类型。这些函数ivec
用于确定要写入/读取的像素。为了计算正确ivec
,我需要知道图像的大小。但是我该如何找回呢?
textureSize()
似乎只适用于采样器,不适用于图像。
怎么做?
opengl - OpenGL 4.2 使用与图像和采样器相同的纹理
使用与 image2D 和 sampler2D 相同的纹理是否合法(并且定义明确)?
目前我在 GLSL 着色器中使用 imageLoad() 和 imageStore() 从 image2D 写入和加载。但是,我也想从纹理的某些 mipmap 级别读取(而不是写入),但这不受 imageLoad 支持(我想我必须将每个 mipMap 级别绑定为单独的 image2D,但可用图像单元的数量是相当有限)。所以我的问题是,是否可以将我用作 imageStore() 的 image2D 的相同纹理也用作与 textureLod() 一起使用的 sampler2D?
opengl - GLSL image2D 抗锯齿
是否可以为 image2D 设置 MSAA 采样?它可以在OpenGL中作为texture2D的多重采样类型吗?我写的第一遍不是渲染缓冲区(或纹理),而是图像,我存储了相同图元的多个像素副本但偏移量不同。然后我将它blit到主窗口帧缓冲区。输出具有很强的混叠和我想知道是否有可能第一次使用 MSAA。
opengl - 在 GLSL 中的图像单元上设置只读/只写的性能影响
在glBindImageTexture()
, access
可以是GL_READ_ONLY
, GL_WRITE_ONLY
, 或GL_READ_WRITE
. 我假设这些应该与GLSL 中图像单元(例如or )上的readonly
andwriteonly
限定符匹配。image2D
imageBuffer
设置只读或只写(2013,NVIDIA 319.49 驱动程序)时,我没有注意到任何区别。当然,我可能不会做任何会导致减速的事情,因此看不到任何改进。当前的 GL 实现也可以简单地忽略这些限定符。
- 在什么情况下 GL 实现可以使用只读/只写,为什么它们存在?
我想到了缓存一致性,但coherent
/volatile
限定词是否已经涵盖了这一点?我用过这些,它们似乎有效。
- 有没有人在使用只读/只写时经历过性能或结果的差异,它们有多重要?
如果已经有好几年了,不要害怕回复,我很想知道,我相信其他人也是。
opengl - GLSL 原子图像访问
我的另一篇文章打算收集有关 GLSL 自旋锁种类的一般信息,但不幸的是,它没有任何结果,也没有解决我的问题。因此,一个具体的问题。我将我的问题简化为一个最小的示例,如下所示:
微不足道的问题使屏幕大小的锁纹理和颜色纹理。在第一阶段,颜色都设置为零(着色器 1)。在第二步中,绘制了两个三角形,几何着色器将其翻了四倍并略微偏移(着色器 2)。片段着色器以原子方式增加纹理的颜色。在第三阶段,颜色被可视化(着色器 3)。
着色器 1:
着色器 2:
着色器 3:
主循环:
- 启用着色器 1
- 渲染全屏四边形
glMemoryBarrier(GL_ALL_BARRIER_BITS);
启用着色器 2
- 渲染两个小三角形
glMemoryBarrier(GL_ALL_BARRIER_BITS);
启用着色器 3
- 渲染全屏四边形
请注意,在第 3 步和第 6 步中,我 [认为我] 可以使用 GL_SHADER_IMAGE_ACCESS_BARRIER_BIT。以防万一,我是保守的。
可视化的颜色随时间抖动,并且大多相当小。这表明原子性没有发生。有人可以理智地检查这个程序吗?我错过了什么吗?
编辑:从这个页面,我发现使用discard
可以使图像加载/存储在片段中未定义。我删除了丢弃物,但问题仍然存在。我还发现layout(early_fragment_tests) in;
,它强制进行早期片段测试(它也没有帮助)。
opengl - 如何在 GLSL 中获取图像单元(例如 image2D)的大小,就像 textureSize 一样
textureSize是一个方便的函数,可以在着色器中获取纹理尺寸,而无需将它们作为制服手动传递。
图像单元是否有类似的 API ?
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 并同时写入所有这些的最佳方法是什么?
opengl - 使用 image_load_store 写入单个颜色通道
image_load_store 扩展提供加载/存储功能,*vec4
只能访问。例如,如果我有layout(rgba32f) uniform image2D myimage;
,似乎我必须一次写入整个像素:
如果我只想将红色通道设置为1
,我需要这样做:
这在额外的读取中引入了相当多的开销。
有没有我可以用来只写入特定频道的机制?
类似的东西glColorMask
,或者可能将数据绑定到不同的格式,例如更大的GL_R32F
image2D
或imageBuffer
?如果是这样,有哪些开销影响(例如转换/传输/缓存问题)?
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?