我试图在不使用的情况下将sampler2D
类型的变量放入我的着色器中
一个统一的变量。
相反,我想使用着色器存储缓冲区对象(SSBO)将其交给它。
必须在结构中声明什么类型的变量才能移交?
如何在着色器中将此类型转换为sampler2D
?
答案 0 :(得分:3)
你不能这样做,sampler
只是不透明的类型,而不是真正的变量,在着色器中可以访问任何值。 OpenGL实现将使用您通过glUniform1i
设置给采样器的值来实际设置纹理采样,以了解如何在特定硬件上完成 - 在某些实现中,更改采样器的值实际上触发了重新编译或修补着色器代码。
因此,sampler
类型只能在GLSL着色器的默认统一块中声明,采样器的值不能来自SSBO,UBO,TBO或其他任何类型,并且您不能使用{{ 1}}在GLSL中输入ls值。
围绕这些限制的唯一方法是bindless textures,它允许你想要做的事情。但请注意,这些不是迄今为止任何OpenGL版本的核心功能(GL 4.6作为编写时间),因此目前仅作为GL扩展存在。此外,此功能的硬件和驱动程序支持在目前还远未普及。