【发布时间】: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