我应该垂直翻转加载了STB_IMAGE的图像的线条以在OpenGL中使用吗? [英] Should I vertically flip the lines of an image loaded with stb_image to use in OpenGL?

查看:83
本文介绍了我应该垂直翻转加载了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,这应该会更快一些。

这篇关于我应该垂直翻转加载了STB_IMAGE的图像的线条以在OpenGL中使用吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆