如何从着色器中的着色器存储缓冲区对象获取 sampler2D 类型?

How to acquire the sampler2D type from a Shader Storage Buffer Object inside a shader?

我试图在不使用的情况下将 sampler2D 类型的变量放入我的着色器中 统一变量。

相反,我想使用着色器存储缓冲区对象 (SSBO) 将其移交。 必须在结构中声明什么类型的变量才能交出? 然后如何在着色器中将此类型转换为 sampler2D

你不能那样做,samplers 只是不透明类型,而不是其值可在着色器中访问的真实变量。 OpenGL 实现将使用您通过 glUniform1i 设置给采样器的值来实际设置纹理采样,以了解如何在您的特定硬件上完成 - 在某些实现中,更改采样器的值实际上会触发重新编译或修补着色器代码。

因此,sampler 类型只能在 GLSL 着色器的默认统一块中声明,采样器的值不能来自 SSBO、UBO、TBO 或其他任何东西,并且您不能使用sampler 在 GLSL 中键入左值。

绕过这些限制的唯一方法是 bindless textures,它可以让您完全按照自己的意愿行事。但请注意,这些并不是迄今为止任何 OpenGL 版本(撰写本文时为 GL 4.6)的核心功能,因此目前仅作为 GL 扩展存在。此外,硬件和驱动程序对该功能的支持目前还远未普及。