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

dag*_*ute 3 opengl glsl shader-storage-buffer

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

相反,我想使用着色器存储缓冲区对象 (SSBO) 来移交它。必须在结构中声明什么类型的变量才能移交?我怎样才能sampler2D在着色器中投射这种类型?

der*_*ass 5

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

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

绕过这些限制的唯一方法是无绑定纹理,它允许您做您想做的事情。但请注意,这些都不是迄今为止任何 OpenGL 版本的核心功能(撰写本文时为 GL 4.6),因此目前仅作为 GL 扩展存在。此外,目前对该功能的硬件和驱动程序支持还远未普及。