3

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

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

4

1 回答 1

5

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

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

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

于 2018-01-21T21:00:41.347 回答