纹理地图集(正确地在着色器中)的现代OpenGL拼贴区域

时间:2018-11-25 21:19:40

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

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

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

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

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

我的想法是将应使用的图集的插槽以及面的大小加载到着色器中,并以某种方式将图集的一部分平铺在整个面上。但是我绝对不知道该怎么做。由于我的对象在整个场景中移动,因此无法选择将每个纹理加载到一个VAO中,或者将每个纹理批量合并到一个VAO中,因为这绝对会降低性能。

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

1 个答案:

答案 0 :(得分:0)

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