在不更改 UV 坐标的情况下调整 OpenGL 纹理的大小
Resizing an OpenGL texture without changing UV coordinates
我有一个在游戏过程中生成的纹理图集。加载和卸载纹理取决于玩家四处移动时可见的纹理。
问题是当有太多纹理无法放入图集中,我需要调整它的大小,但如果我只是通过将它复制到更大的纹理来调整纹理图集的大小,那么我将需要重新渲染更新四边形的 UV 坐标的所有内容。
是否可以通过某种方式创建 OpenGL 纹理并将其在 UV 坐标中的宽度和高度定义为 1 以外的值?
一种解决方案是使用纹素坐标而不是归一化坐标(假设当您将图集变大时您不打算在图集中缩放或移动图像)。如果您可以忍受它们的限制(没有包装,没有 mipmap,只有线性过滤),您可以只使用 Rectangle Textures 并结束它。或者,您可以简单地将比例因子应用于顶点着色器中的纹理坐标,方法是将它们作为制服传递或使用 textureSize()
GLSL 函数直接查询着色器中的纹理尺寸。
或者,您可以考虑使用 Array Texture 来保存多个地图集。无需扩大现有图集来为更多子图像腾出空间,您可以在另一个阵列切片中开始一个新图集。这样,所有现有子图像的纹理坐标将保持不变……
我有一个在游戏过程中生成的纹理图集。加载和卸载纹理取决于玩家四处移动时可见的纹理。
问题是当有太多纹理无法放入图集中,我需要调整它的大小,但如果我只是通过将它复制到更大的纹理来调整纹理图集的大小,那么我将需要重新渲染更新四边形的 UV 坐标的所有内容。
是否可以通过某种方式创建 OpenGL 纹理并将其在 UV 坐标中的宽度和高度定义为 1 以外的值?
一种解决方案是使用纹素坐标而不是归一化坐标(假设当您将图集变大时您不打算在图集中缩放或移动图像)。如果您可以忍受它们的限制(没有包装,没有 mipmap,只有线性过滤),您可以只使用 Rectangle Textures 并结束它。或者,您可以简单地将比例因子应用于顶点着色器中的纹理坐标,方法是将它们作为制服传递或使用 textureSize()
GLSL 函数直接查询着色器中的纹理尺寸。
或者,您可以考虑使用 Array Texture 来保存多个地图集。无需扩大现有图集来为更多子图像腾出空间,您可以在另一个阵列切片中开始一个新图集。这样,所有现有子图像的纹理坐标将保持不变……