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