为什么采样器不能成为 OpenGL 中统一块的一部分,有什么方法可以解决它?

dra*_*nie 4 opengl

我想将场景渲染为纹理,并在多个程序中共享纹理采样器。类似于在多个程序中共享项目视图矩阵。与可以放入统一块中的项目视图矩阵不同,“采样器不能是统一块的一部分”。https://www.opengl.org/wiki/Uniform_(GLSL)

这里的一些讨论描述了原因:

多个问题:
GLSL 采样器体现了两件事:纹理数据源以及如何从中过滤(最近的、线性的、mipmapping、各向异性等)
样本是不透明的东西,将它们放入统一的缓冲区对象需要它们有一个明确定义的(和跨平台)大小。
这些问题加在一起使其变得充满风险。

我想看到一些关于为什么不能处理这个问题的解释以及实现共享纹理采样器的任何其他方法。

dat*_*olf 6

解释就在这里:

样本是不透明的东西,要将它们放入统一的缓冲区对象中需要它们具有明确定义的(且跨平台的)大小。

统一块的目的是,您可以通过(客户端)程序中的单个结构的单个 OpenGL 调用进行设置。但要使其工作,必须知道该结构的内存布局,以便编译器生成的内存布局与着色器统一块的内存布局相匹配。

但由于采样器的内存布局未定义,因此无法确定内存布局。没有明确的内存布局就没有结构,没有结构就没有块。