gpt4 book ai didi

c++ - 我应该垂直翻转加载有 stb_image 的图像的线条以在 OpenGL 中使用吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:54:32 24 4
gpt4 key购买 nike

我正在研究 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) 用于 Sprite 动画,这意味着我需要单独反转纹理图 block ,这看起来很痛苦,而不是通用解决方案。

2- 我可以使用纹理坐标转换来垂直翻转 GPU 上的 UV(在我的 GLSL 着色器中)。

第三种可能的选择是使用 glPixelStore 来指定输入数据......但我找不到一种方法来告诉它输入的像素是垂直翻转的。

您对处理我的问题有何建议?我想我不可能是唯一一个使用 stbi_load + OpenGL 并遇到这个问题的人。

最后,我的目标平台是 PC、Android 和 iOS :)

编辑:我回答了我自己的问题......见下文。

最佳答案

我知道这个问题已经很老了,但它是尝试解决这个问题时谷歌上的第一个结果之一,所以我想我会提供一个更新的解决方案。

在这个问题最初被问到之后的某个时候,stb_image.h 添加了一个名为“stbi_set_flip_vertically_on_load”的函数,只需将 true 传递给这个函数就会导致它以 OpenGL 期望的方式输出图像 - 从而消除了手动翻转/纹理坐标翻转的需要.

此外,对于那些不知道从哪里获得最新版本的人,无论出于何种原因,您都可以在正在积极开发的 github 上找到它: https://github.com/nothings/stb

还值得注意的是,在 stb_image 的当前实现中,它们逐个像素地翻转图像,这并不完全符合性能。这可能会在以后更改,因为他们已经将其标记为进行优化。 编辑:看来他们已经切换到 memcpy,这应该会快一点。

关于c++ - 我应该垂直翻转加载有 stb_image 的图像的线条以在 OpenGL 中使用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19770296/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com