纹理图集中的现代 OpenGL 平铺区域(正确地在着色器中)
Modern OpenGL tiling region in texture atlas (properly in shader)
我正在使用现代 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 中是否有任何功能可以帮助我仅平铺纹理的一部分?
好的,经过数小时的研究,我终于找到了解决问题的方法。
我发现的功能称为 "texture arrays" 并且自 OpenGL 3.3 以来一直处于核心状态。
所以使用起来很安全,对性能影响不大。就我而言,它也给了我很大的性能改进。实施起来也非常简单。
如果有人遇到类似的问题,这里是 link,它解释了纹理数组的工作原理:https://www.khronos.org/opengl/wiki/Array_Texture
我正在使用现代 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 中是否有任何功能可以帮助我仅平铺纹理的一部分?
好的,经过数小时的研究,我终于找到了解决问题的方法。 我发现的功能称为 "texture arrays" 并且自 OpenGL 3.3 以来一直处于核心状态。 所以使用起来很安全,对性能影响不大。就我而言,它也给了我很大的性能改进。实施起来也非常简单。 如果有人遇到类似的问题,这里是 link,它解释了纹理数组的工作原理:https://www.khronos.org/opengl/wiki/Array_Texture