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

时间:2018-01-21 20:43:02

标签: opengl glsl shader-storage-buffer

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

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

1 个答案:

答案 0 :(得分:3)

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

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

围绕这些限制的唯一方法是bindless textures,它允许你想要做的事情。但请注意,这些不是迄今为止任何OpenGL版本的核心功能(GL 4.6作为编写时间),因此目前仅作为GL扩展存在。此外,此功能的硬件和驱动程序支持在目前还远未普及。