我一直在研究接口查询,以防止用于调试的常见错误,例如忘记绑定缓冲区、绑定错误的资源类型等。
然而,我无法找到我想要的图像。我想确保纹理的类型、内存限定符和纹理格式在c++代码和着色器中是相同的:
glBindImageTexture(index, texture, 0, true, 0, GL_READ_ONLY, GL_RGBA32F);
layout(binding = 0, rgba32f) uniform writeonly iimage2D _heightmap;
使用glGetProgramResourceiv和GL_UNIFORM和GL_TYPE,我能够得到图像的类型iimage2D。但是没有内存限定符和图像格式。
除了解析着色器之外,还有其他方法吗?
发布于 2020-07-26 14:07:38
这些都是无法通过内省获得的。还应该指出的是,其中一些不需要“匹配”。
着色器定义的格式不必与图像绑定格式相同。图像绑定格式定义了如何从图像写入解释由着色器提供的数据。着色器定义的格式决定如何读取图像中的数据。因此,这两个值从根本上说是在做不同的事情,不需要相互匹配,也不需要匹配纹理的内部格式。有这些转换与图像实际格式之间的转换规则。
对于访问类型,您可以通过GL_READ_WRITE
获取所有信息,让着色器决定如何访问存储空间。考虑到Vulkan没有这个值,从性能上看,这可能并不重要。另外,请注意,在一个调用中绑定多个映像的多绑定函数glBindImageTextures
总是使用GL_READ_WRITE
(并且没有指定的格式)。由于该函数的全部功能是性能,所以如果始终使用绑定侧的读-写,几乎可以肯定地说,这并不重要。
https://computergraphics.stackexchange.com/questions/10058
复制相似问题