【问题标题】:Modern OpenGL tiling region in texture atlas (properly in shader)纹理图集中的现代 OpenGL 平铺区域(正确在着色器中)
【发布时间】:2019-04-27 13:34:37
【问题描述】:

我正在使用现代 OpenGL 渲染 3D 场景,其中包含我所有的纹理的纹理图集。

纹理坐标计算非常简单,并被加载到着色器的 VBO 中。这是伪代码中的一些基本计算:

int posX = slot % texturesInAtlasX, posY = slot / texturesInAtlasX;
float startX = 1f / texturesInAtlasX * posX;
float startY = 1f / texturesInAtlasY * posY;

通常我使用它来计算矩形的 4 个纹理坐标,以将图集的一部分应用于它。但是由于场景的复杂性,我不得不通过将具有相同纹理的一些面计算为一个来简化网格。通常这没什么大不了的,因为在 OpenGL 中,您可以通过将坐标提高到 1 以上来轻松平铺纹理。但是由于我使用的是纹理图集,因此通过更改纹理坐标的计算方式很难做到这一点。

我的想法是将应该使用的图集的插槽和面的大小加载到着色器中,并以某种方式将图集的一部分平铺在脸上。但我完全不知道该怎么做。由于我的对象是单独在场景中移动的,因此不能将对象加载到每个纹理的一个 VAO 中或将每个纹理的对象批处理在一起,因为这绝对会影响性能。

所以我的问题是:OpenGL 中是否有任何功能可以帮助我仅平铺纹理的一部分?

【问题讨论】:

  • "将对象加载到每个纹理的一个 VAO 中或将每个纹理的对象批处理在一起不是一种选择,因为这绝对会影响性能" 但是您认为更改 VAO 和纹理经常会提高性能?

标签: opengl textures shader texture-mapping texture-atlas


【解决方案1】:

好的,经过数小时的研究,我终于找到了解决问题的方法。 我发现的功能称为“纹理数组”,自 OpenGL 3.3 起就成为核心。 所以它使用安全,对性能没有太大影响。就我而言,它也给了我很大的性能提升。实施起来也很简单。 如果有人遇到类似的问题,这里有一个解释纹理数组如何工作的链接:https://www.khronos.org/opengl/wiki/Array_Texture

【讨论】:

    猜你喜欢
    • 2011-09-22
    • 1970-01-01
    • 1970-01-01
    • 2015-03-10
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多