Opengl 使用不同纹理绘制多个对象

Opengl 使用不同纹理绘制多个对象,opengl,Opengl,我是否正确理解,在OpenGL中绘制多个对象(每个对象具有不同的纹理)的典型方法是使用glBindTexture一次绑定一个纹理并绘制使用它的对象,然后绑定不同的纹理并执行相同的操作 换句话说,在任何特定时间,只有一个纹理可以“激活”进行绘制,这就是使用glBindTexture绑定的最后一个纹理。这是正确的吗 使用glBindTexture一次绑定一个纹理并绘制使用它的对象,然后绑定不同的纹理并执行相同的操作 换句话说,在任何特定时间,只有一种纹理可以“激活”进行绘制 这两种说法不是一回事 单

我是否正确理解,在OpenGL中绘制多个对象(每个对象具有不同的纹理)的典型方法是使用
glBindTexture
一次绑定一个纹理并绘制使用它的对象,然后绑定不同的纹理并执行相同的操作

换句话说,在任何特定时间,只有一个纹理可以“激活”进行绘制,这就是使用
glBindTexture
绑定的最后一个纹理。这是正确的吗

使用glBindTexture一次绑定一个纹理并绘制使用它的对象,然后绑定不同的纹理并执行相同的操作

换句话说,在任何特定时间,只有一种纹理可以“激活”进行绘制

这两种说法不是一回事

单个渲染操作在任何时候都只能使用一组纹理。该集由当前绑定到各种纹理图像单元的纹理定义。可用纹理图像单位的数量可通过
GL\u MAX\u COMBINED\u texture\u image\u units
查询

因此,对于单个渲染命令,多个纹理可以处于“活动”状态

但是,这与绑定一组纹理然后渲染多个对象不同,其中每个对象只使用一些(或一个,在您的情况下)绑定的纹理。你可以这么做,但事实上,没什么意义

GLSL采样器和纹理图像单元之间的关联是程序对象状态的一部分。是的。因此,为了执行您的建议,您必须绑定一组纹理,将统一设置为其中一个,渲染,然后将统一设置为下一个,渲染,等等

您仍然要承担绑定这些纹理的所有成本。你仍然要承担所有换制服的开销。实际上,它可能效率较低,因为常规方法(绑定、渲染、绑定、渲染)不涉及更改统一状态

而且,这很奇怪。通常,您不应该动态更改统一采样器状态。您定义了一个简单的约定(漫反射纹理来自单元0,镜面反射来自单元1,等等),并坚持该约定。任何GL 3.x级硬件都需要提供不少于48个纹理图像单元(每个阶段16个),因此不会耗尽

有一些机制可以做一些与你所说的并不完全不同的事情。例如,可以利用,尽管这需要显式着色器逻辑和支持。这几乎肯定比“绑定一堆纹理”方法快,因为您只绑定一个纹理。此外,您要更改的统一是常规数据统一,而不是采样器统一,这可能更快

使用阵列纹理机制,您还可以利用,假设您使用稍微不同的参数渲染同一对象