似乎我对与图像加载/存储相关的OpenGL格式转换感到困惑。 我来自DX世界,事情相对清晰。例如:
RGBA32_FLOAT
)RWTexture2D<float4>
中声明与格式您还可以将RGBA8_UNORM
纹理绑定到RWTexture2D<float4>
,DirectX将以明显清晰的方式执行格式转换。
现在说我想在OpenGL中做同样的事情。所以我
layout(rgba32f) uniform image2D myImg;
glBindImageTexture( ..., GL_RGBA32F);
所以我计算了四个指定格式的地方:
宣布图像单位时两次:
layout(rgba32f)
image2D
本身告诉我所有加载/存储操作都需要vec4
(不是ivec4
或uvec4
)当我使用glBindImageTexture
我无法理解layout(rgba32f)
的目的是什么,这似乎完全是多余的。似乎知道内部纹理格式足以执行所有格式转换。如果我的内部纹理格式规范化RGBA8
并且图像定义为uniform image2D myImg;
,我需要指定哪种布局?为什么我需要指定布局,不清楚应该执行什么样的格式转换?
我唯一能够证明这些布局的理念是执行数据重新解释,例如将原始RGBA32F
数据写入RGBA32U
纹理,这对我来说似乎并不是很有用。此外,你还有像floatBitsToInt()
这样的功能。
将格式传递给glBindImageTexture
的目的是什么,对我来说是个完全谜。
所以这些布局对我来说是一个巨大的混乱源。你能帮我更好地理解他们背后的原因吗?
答案 0 :(得分:1)
将格式传递给glBindImageTexture的目的是什么,对我来说是个完全谜。
在GL中,人们经常可以在&#34;问题&#34;中找到特定API决策背后的推理。相关扩展规范的部分。在这种情况下,
GL_ARB_shader_image_load_store
扩展程序的第31期可能会
乐于助人:
(31)为什么
format
上有BindImageTexture
参数?已解决:它允许一些比特流,以查看纹理 同 一种格式使用另一种格式。除了任何好处 查看具有不同格式的纹理,它也允许原子 通过允许它们对一些多组件纹理进行操作 使用
R32I
或R32UI
格式查看。在
EXT_shader_image_load_store
扩展程序中,还有一个附加内容 有利于解决对格式集的更严格限制 商店支持 - 仅限R8
,R16
,R32F
,RG32F
,RGBA32F
等格式 在那里得到支持。其他不支持的格式可以视为 支持的格式(例如,RGBA8
可以映射到R32UI
),使用着色器代码 做任何需要的包装和拆包。
因此,应该将内部纹理格式和图像格式视为两个不同的东西。它们必须兼容,但它们不必匹配。
我无法理解
layout(rgba32f)
的目的是什么,这似乎完全是多余的。似乎知道内部纹理格式足以执行所有格式转换。
图像的内部格式(不是纹理)可能已足够 - 但该信息不是着色器状态的一部分,并且未知着色器编译时间。 GL并没有将用户的背后隐藏起来。布局限定符中的格式必须与完全匹配关联图像单元的格式,否则结果将不确定。着色器只会以指定的格式读取或写入数据,如果与实际数据不匹配,您就会被搞砸,规格也不能保证。
如果我的内部纹理格式是规范化的RGBA8并且图像被定义为
uniform image2D myImg
,我需要指定什么布局;
layout(rgba8)
是根据规范允许的唯一一个。
我唯一能够证明这些布局的理念是执行数据重新解释,例如将原始
RGBA32F
数据写入RGBA32U
纹理,这对我来说似乎没有用。
你真的倒退了。 layout(format)
不允许重新解释,format
的{{1}}参数至少以有限的方式进行重新解释。