gpt4 book ai didi

c++ - 如何在 OpenGL 中编写自动分配纹理单元的类或函数

转载 作者:行者123 更新时间:2023-11-30 04:24:16 25 4
gpt4 key购买 nike

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

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. 如何编写类或函数使用常量自动分配纹理单元。

有什么想法吗?代码片段将不胜感激。

最佳答案

How to write a class or function automatically allocate the texture unit using the constants.

这很简单:不要。

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

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

没有必要在不需要时更改程序状态。

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

since there are many different constants that define how many sampler object I can use:

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

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

关于c++ - 如何在 OpenGL 中编写自动分配纹理单元的类或函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12880452/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com