我正在练习使用OpenGL,并且面临的任务是实现向不同对象(在我的情况下,是由顶点组成的网格)添加多个不同纹理的能力。我知道您可以使用GL_TEXTURE0 + i,其中是从 0 到 31 的i数字。但是这里有一个限制,我只能使用 32 个纹理(而我需要更多)。另外,我还实现了实例化,这也为编写程序增加了细微差别(因此,我无法在渲染之前使用每个单独的网格切换到必要的纹理)。请告诉我如何成功实现我所需要的?glActiveTexture
我正在练习使用OpenGL,并且面临的任务是实现向不同对象(在我的情况下,是由顶点组成的网格)添加多个不同纹理的能力。我知道您可以使用GL_TEXTURE0 + i,其中是从 0 到 31 的i数字。但是这里有一个限制,我只能使用 32 个纹理(而我需要更多)。另外,我还实现了实例化,这也为编写程序增加了细微差别(因此,我无法在渲染之前使用每个单独的网格切换到必要的纹理)。请告诉我如何成功实现我所需要的?glActiveTexture
当多个网格需要多个纹理时,为了渲染每个网格,您将必须更改管道状态,并设置与着色器中使用的纹理单元()中的对象相对应的纹理
glActiveTexture。与管道状态的任何改变一样,此类操作会产生一些开销并降低性能。您可以在着色器中使用采样器数组,使用多个纹理块而不是一个,并将不同的纹理附加到不同的块,而不是不断地切换它们。但这是一个糟糕的选择。首先,纹理块的数量是有限的。尽管在具有当前图形加速器的台式机上,它们的数量通常明显大于历史存在的常数
GL_TEXTURE31,但它仍然受到GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS可以达到几百的值的限制。而在移动设备上,这个限制只能是 8。其次,将纹理块预算花在一个着色器的不同纹理上是不合理的;相反,它应该花在不同的着色器上,以避免在切换到另一个着色器时改变图形管道的状态时产生额外的开销(例如,第一个着色器使用块 1、2、3,第二个着色器使用块 4、5、6 等)。最基本的方法是将多张纹理合并为一张大纹理,即创建纹理图集,以减少所需的纹理数量。
由于纹理大小的限制,所有纹理可能无法容纳到一个大纹理中。在这种情况下,您可以采取下一步 - 转到纹理数组
GL_TEXTURE_2D_ARRAY,其中每一层将是一张纹理图集。本质上,这种方法允许您一次将多个纹理分配给一个纹理块。当纹理数量变得如此之大,以致于图形加速器的内存无法再容纳时,在高级图形 API(例如 DirectStorage)中,可以使用动态加载的虚拟纹理,即仅使用当前渲染所需的纹理来补充图形加速器的内存。
我并不完全理解“
GL_TEXTURE0 + i”设计的功能。虽然现存最大的元素是 GL_TEXTURE31,但后续元素可以通过添加 GL_TEXTURE 标记和整数来输出,这意味着在此实现中可以同时使用的纹理数量没有限制。为了让每个对象都有独特的纹理,您可以创建一个采样器数组(纹理通过制服分配)并指定所需纹理的索引。欢迎来到 graphonia 的现实。在这里您必须不断切换纹理和着色器。
一次着色器运行的最大值。您可以将任意多的内容放入 OpenGL 中。
这个问题肯定有解决办法。
https://dev.epicgames.com/documentation/en-us/unreal-engine/downloading-unreal-engine-source-code