我正在开发一个基于 OpenGL 的 2d 引擎。
我使用 stb_image 加载图像数据,以便创建 OpenGL 纹理。我知道 OpenGL 的 UV 原点是左下角,我也打算在该空间中处理我的屏幕空间 2d 顶点,即我正在使用 glm::ortho( 0, width, 0, height, -1, 1 ),不反转 0 和高度。
您可能猜到了,我的纹理是垂直翻转的,但我 100% 确定我的 UV 指定正确。
那么:这是stbi_load存储像素数据造成的吗?我目前仅加载 PNG 文件,因此我不知道如果我使用其他文件格式是否会导致此问题。会吗? (我现在不能测试,我不在家)。
我真的很想将屏幕坐标保留在“标准”OpenGL 空间中...我知道我可以反转正交投影来修复它,但我真的不愿意。
我可以看到两个明智的选择:
1-如果这是由像素数据的 stbi_load 存储引起的,我可以在加载时反转它。出于性能原因,我有点担心这一点,因为我使用纹理数组(glTexture3d)进行精灵动画,这意味着我需要单独反转纹理图块,这看起来很痛苦,而且不是通用的解决方案。
2-我可以使用纹理坐标转换来垂直翻转 GPU 上的 UV(在我的 GLSL 着色器中)。
可能的第三个选项是使用 glPixelStore 来指定输入数据...但我找不到一种方法来告诉它传入的像素是垂直翻转的。
您对处理我的问题有何建议?我想我不可能是唯一一个使用 stbi_load + OpenGL 并遇到这个问题的人。
最后,我的目标平台是 PC、Android 和 iOS :)
编辑:我回答了我自己的问题......见下文。