我正在开发一个基于 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 :)
编辑:我回答了我自己的问题......见下文。