我应该垂直翻转加载了STB_IMAGE的图像的线条以在OpenGL中使用吗?
我正在使用OpenGL驱动的2D引擎。
我使用STB_IMAGE加载图像数据,以便可以创建OpenGL纹理。我知道OpenGL的UV原点是左下角,我还打算在该空间中为我的屏幕空间2D顶点工作,即我使用的是GLM::Ortho(0,width,0,Height,-1,1),而不是反转0和Height。
您可能已经猜到了,我的纹理是垂直翻转的,但我百分之百确定我的UV指定正确。
那么:这是由stbi_load存储像素数据引起的吗?我目前只加载PNG文件,所以我不知道如果我使用另一种文件格式会不会导致这个问题。会吗?(我现在不能测试,我不在家)。我真的想让屏幕坐标保持在"标准"OpenGL空间中.我知道我可以通过反转正交投影来修复它,但我真的不想这样做。
我可以看到两个合理的选项:
1-如果这是由像素数据的stbi_load存储引起的,我可以在加载时反转它。出于性能原因,我有点担心这一点,因为我将纹理数组(GlTexture3d)用于精灵动画,这意味着我需要单独反转纹理块,这似乎很痛苦,而且不是一个通用的解决方案。
2-我可以使用纹理坐标变换垂直翻转GPU上的UV(在我的GLSL着色器中)。
可能的第三个选项是使用glPixelStore指定输入数据.但是我找不到一种方法来告诉它传入的像素是垂直翻转的。您对处理我的问题有什么建议?我想我不可能是唯一一个使用stbi_load+opengl并且有这个问题的人。
最后,我的目标平台是PC、Android和iOS:)
编辑:我回答了自己的问题.请参见下面的内容。解决方案
我知道这个问题很老了,但它是谷歌在尝试解决此问题时的首批结果之一,所以我想我应该提供一个更新的解决方案。
在最初提出此问题后的一段时间,stb_image.h添加了名为";stbi_set_flip_vertical_on_load";的函数,只需将true传递给此函数即可使其以OpenGL预期的方式输出图像,从而消除了手动翻转/纹理坐标翻转的需要。
此外,对于那些不知道从哪里获得最新版本的人,无论出于什么原因,您都可以在GitHub上找到它,GitHub正在积极开发中: https://github.com/nothings/stb还值得注意的是,在STB_IMAGE的当前实现中,他们逐个像素地翻转图像,这并不是很好。这可能会在以后更改,因为他们已经将其标记为优化。编辑:他们似乎已切换到memcpy,这应该会更快一些。
相关文章