OpenGL - 同一对象的不同表面上的不同纹理

标签 opengl textures texturing

我正在尝试为使用 OpenGL 制作的游戏绘制汽车。汽车对象存储在一个带有 .mtl 文件的 .obj 文件中。

这辆车有 500 多个顶点,100 多个面,需要使用我自己的顶点和片段着色器应用超过 50 种不同的纹理。我已经通过使用缓冲区对象来解决这个问题,它一次发送有关我的对象的所有信息。我的问题是尝试将不同的纹理应用于同一对象的不同表面。

我发现这个问题的答案是将纹理绑定(bind)到某个纹理编号(即 GL_TEXTURE0、GL_TEXTURE1 等...)并将 Sampler2D 传递给引用它的片段着色器。但是,我可以用这种方式存储超过 50 个纹理吗?据我所知,它转到 GL_TEXTURE32。

另外,我如何告诉着色器仅将纹理应用于汽车对象的某个面?

最佳答案

您不能以这种方式渲染模型,您可以一次绑定(bind)所有纹理。一个片段着色器,即使对于高端的 GL 4.1 级硬件,也只能访问 16 个纹理。也就是说,它只能有 16 个采样器。

总纹理计数更高,因为其他着色器阶段也可以使用纹理。

处理它的正确方法是执行以下操作之一:

  • 回到你的建模师那里,让他们减少模型的纹理数量。
  • 使用工具构建纹理图集(即:将所有图像放入单个纹理中),适当更改模型的纹理坐标。根据您计划支持的硬件,这可以是大型 2D 纹理或 2D 纹理阵列。后者需要纹理坐标的第三个值:数组中图像的索引。
  • 按纹理对三角形进行排序。对于每个纹理,渲染所有使用该纹理的三角形。

  • #3 是唯一不需要更改数据的解决方案。但请注意:如果您经常渲染这辆车(例如,每帧数千次),则状态更改开销可能是性能问题。 #1 和#2 的某种组合是通常首选的方法。

    顺便说一句,如果您的模型只有几百个面,但有 50 个纹理,那么建模过程中可能出现了严重错误。

    关于OpenGL - 同一对象的不同表面上的不同纹理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6788380/

    相关文章:

    c++ - glDrawArrays 抛出 1282 错误并且不绘制任何东西

    c++ - 无法使用 OpenGL 创建彩色三角形

    c# - 如何从用户计算机加载图像

    OpenGL GL_R8 生成一个 0x501,GL_RGB8 没有

    swing - JavaFX GUI,复杂 3D 图形的最简单方法

    c++ - 加载共享库时出错 : libGLEW. so.1.10:无法打开共享对象文件

    java - 使用深度纹理获取 GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT

    android - 在Android OpenGL ES 1.1 中,如何在三角形的两边绘制纹理?

    c++ - 调用 glTexSubImage2D 时出现 OpenGL 错误 'invalid value'

    c# - 统一: Texturing a Shoreline in a Hexgrid