我试图在sampler2D
不使用统一变量的情况下将类型变量放入我的着色器中。
相反,我想使用着色器存储缓冲区对象 (SSBO) 将其移交。什么类型的变量必须在结构中声明才能移交?然后如何将这种类型投射到sampler2D
着色器中?
我试图在sampler2D
不使用统一变量的情况下将类型变量放入我的着色器中。
相反,我想使用着色器存储缓冲区对象 (SSBO) 将其移交。什么类型的变量必须在结构中声明才能移交?然后如何将这种类型投射到sampler2D
着色器中?
你不能这样做,sampler
s 只是不透明的类型,而不是在着色器中可以访问其值的真实变量。OpenGL 实现将使用您设置给采样器的值glUniform1i
来实际设置纹理采样,以便在特定硬件上完成该操作 - 在某些实现中,更改采样器的值实际上会触发重新编译或修补着色器代码。
因此,sampler
类型只能在 GLSL 着色器的默认统一块中声明,采样器的值不能来自 SSBO、UBO、TBO 或其他任何东西,并且您不能sampler
在 GLSL 中使用类型作为左值。
绕过这些限制的唯一方法是无绑定纹理,它可以完全允许您想要做的事情。但请注意,迄今为止,这些都不是任何 OpenGL 版本的核心功能(撰写本文时为 GL 4.6),因此目前仅作为 GL 扩展存在。此外,目前对该功能的硬件和驱动程序支持还远未普及。