1

我已经看到许多示例来硬编码程序中纹理单元的数量。例如:

glActiveTexture(GL_TEXTURE0 + 0);
glBindTexture(GL_TEXTURE_2D, object1BaseImage);
glActiveTexture(GL_TEXTURE0 + 2);
glBindTexture(GL_TEXTURE_2D, object1NormalMap);
glActiveTexture(GL_TEXTURE0 + 4);
glBindTexture(GL_TEXTURE_2D, shadowMap);

问题是两个同时使用的纹理在渲染场景时可能会因为使用相同的纹理单元而相互冲突。我的问题是如何通过实现类或函数来自动分配 OpenGL 中的纹理单元?因为有许多不同的常量定义了我可以使用多少个采样器对象:

GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS,
GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS,
GL_MAX_TESS_CONTROL_TEXTURE_IMAGE_UNITS,
GL_MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS,
GL_MAX_TEXTURE_IMAGE_UNITS and
GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS.

我对常数感到困惑,不应该有一个常数GL_MAX_FRAGMENT_TEXTURE_IMAGE_UNITS吗?我想我需要在分配纹理单元时获得最大数量的纹理单元。所以有两个问题:

  1. 如何理解上面提到的六个常数,为什么没有一个名为 的常数GL_MAX_FRAGMENT_TEXTURE_IMAGE_UNITS
  2. 如何编写一个类或函数使用常量自动分配纹理单元。

有任何想法吗?代码片段将不胜感激。

4

1 回答 1

2

如何编写一个类或函数使用常量自动分配纹理单元。

这很简单:不要。

纹理图像单元的“分配”通常由您打算使用的程序设定的约定完成。您决定单元 0 是漫反射纹理所在的位置;如果特定的网格和着色器没有漫反射纹理,则不要在单元 0 中放置任何东西。单元 12 可能是阴影贴图所在的位置。

这就是为什么shading_language_420pack允许您直接在着色器中设置纹理单元。即使没有这个,您通常应该在编译着色器后设置采样器的纹理单元并且不要移动它。

当您不必更改程序状态时,没有任何意义。

在 3.3+ 硬件上,您有不少于 48+ 个可用的纹理单元。你不太可能用完。

因为有许多不同的常量定义了我可以使用多少个采样器对象:

不,有一个常量定义了您可以使用多少个“采样器对象”:GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS. 这是 OpenGL 提供的纹理图像单元总数的硬性限制。glActiveTexture取一个 和 之间的GL_TEXTURE0数字GL_TEXTURE0+GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS

个别的是可以在单个着色器阶段中活动的 GLSL 采样器类型的最大数量。至于你使用哪个片段着色器,它是GL_MAX_TEXTURE_IMAGE_UNITS. 这是出于遗留原因,因为最初只有片段着色器可以访问纹理。

于 2012-10-14T16:25:08.907 回答