Should I vertically flip the lines of an image loaded with stb_image to use in OpenGL?(我应该垂直翻转加载了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中使用吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:我应该垂直翻转加载了STB_IMAGE的图像的线条以在OpenGL中使用吗?


基础教程推荐
- 设计字符串本地化的最佳方法 2022-01-01
- 什么是T&&(双与号)在 C++11 中是什么意思? 2022-11-04
- 运算符重载的基本规则和习语是什么? 2022-10-31
- 您如何将 CreateThread 用于属于类成员的函数? 2021-01-01
- C++,'if' 表达式中的变量声明 2021-01-01
- C++ 标准:取消引用 NULL 指针以获取引用? 2021-01-01
- 如何在 C++ 中处理或避免堆栈溢出 2022-01-01
- 如何定义双括号/双迭代器运算符,类似于向量的向量? 2022-01-01
- C++ 程序在执行 std::string 分配时总是崩溃 2022-01-01
- 调用std::Package_TASK::Get_Future()时可能出现争用情况 2022-12-17