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

3

我正在尝试在不使用uniform变量的情况下将类型为sampler2D的变量传递到我的着色器中。

相反,我想使用Shader Storage Buffer Object(SSBO)来传递它。在结构体中必须声明哪种类型的变量以进行传递?然后我如何在着色器中将此类型转换为sampler2D


1
你看过这个页面了吗?:https://www.khronos.org/opengl/wiki/Shader_Storage_Buffer_Object 它似乎提供了一些关于如何使用SSBO的好资料。 - Nicholas Miller
1个回答

5
您不能这样做,sampler只是不透明类型,而不是实际变量,其值无法在着色器中被访问。OpenGL实现将使用您通过glUniform1i设置的sampler值来实际设置纹理采样方式,以便在特定硬件上完成操作 - 在某些实现中,更改sampler的值实际上会触发着色器代码的重新编译或修补。
因此,sampler类型只能在GLSL着色器的默认uniform块中声明,sampler的值不能来自SSBO、UBO、TBO或其他任何地方,并且您不能在GLSL中使用sampler类型作为左值。
绕过这些限制的唯一方法是绑定纹理,它允许您实现所需的功能。但请注意,到目前为止,这些都不是任何OpenGL版本(GL 4.6)的核心功能,因此目前仅存在于GL扩展中。此外,在此时点,该功能的硬件和驱动程序支持远未普及。

谢谢您的解释。我没有找到关于那个的任何东西。 - dagute

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接