我正在开发一个OpenGL驱动的2d引擎。
我使用stb_image加载图像数据,以便创建OpenGL纹理。我知道OpenGL的UV原点是左下角,我也打算在该空间中为我的屏幕空间2d顶点工作,即我使用的是glm::ortho(0,宽度,0,高度,-1,1),而不是反转0和高度。
你可能已经猜到了,我的纹理是垂直翻转的,但我100%确定我的UV指定正确。
那么:这是由stbi_load存储像素数据引起的吗?我目前只加载PNG文件,所以我不知道如果我使用另一种文件格式是否会导致这个问题。是吗?(我现在不能测试,我不在家)。
我真的很想把屏幕和弦保持在“标准”OpenGL空间中...我知道我可以反转正交投影来修复它,但我真的不想。
我可以看到两个明智的选择:
1-如果这是由stbi_load像素数据存储引起的,我可以在加载时将其反转。出于性能原因,我有点担心这一点,因为我使用纹理数组(glTexture3d)进行精灵动画,这意味着我需要单独反转纹理图块,这似乎很痛苦,而不是一般的解决方案。
2-我可以使用纹理坐标转换来垂直翻转GPU上的UV(在我的GLSL着色器中)。
可能的第三种选择是使用glPixelStore来指定输入数据...但我找不到一种方法来告诉它传入的像素是垂直翻转的。
你们对处理我的问题有什么建议?我想我不能是唯一一个使用openGL stbi_load并遇到这个问题的人。
最后,我的目标平台是PC、Android和iOS:)
编辑:我回答了我自己的问题...见下文。
是的,你应该。这可以通过在加载图像之前简单地调用此STBI函数来轻松完成:
stbi_set_flip_vertically_on_load(true);
好的,我会回答我自己的问题...我浏览了两个库(stb_image和OpenGL)的文档。
以下是可供参考的合适位:
glTexImage2D对数据指针参数做了如下说明:“第一个元素对应于纹理图像的左下角。后续元素从左到右穿过纹理图像最低行中的剩余纹理像素,然后进入纹理图像的连续较高行。最后一个元素对应于纹理图像的右上角。来自http://www.opengl.org/sdk/docs/man/xhtml/glTexImage2D.xml
stb_image库对加载的图像像素表示:“图像加载器的返回值是指向像素数据的‘无符号字符‘。像素数据由*x像素的*y扫描线组成,每个像素由N个交错的8位分量组成;指向的第一个像素位于图像的左上角。”http://nothings.org/stb_image.c
所以,这个问题与图像加载库和OpenGL之间的像素存储差异有关。如果我加载除PNG以外的其他文件格式也没关系,因为stb_image为它加载的所有格式返回相同的数据指针。
所以我决定在我的OglTextureFactory中交换stb_image返回的像素数据。这样,我就可以保持我的方法与平台无关。如果加载时间成为未来的一个问题,我会在加载时删除翻转,转而在GPU上做一些事情。
希望这能在将来帮助其他人。
我知道这个问题很老了,但它是谷歌试图解决这个问题的第一批结果之一,所以我想我应该提供一个更新的解决方案。
在最初提出这个问题之后的某个时候,stb_image.h添加了一个名为“stbi_set_flip_vertically_on_load”的函数,简单地将true传递给这个函数将导致它以OpenGL期望的方式输出图像 - 从而消除了手动翻转/纹理坐标翻转的需要。
此外,对于那些不知道从哪里获得最新版本的人,无论出于什么原因,你都可以在github:https://github.com/nothings/stb找到它
< s >还值得注意的是,在stb_image的当前实现中,他们逐像素翻转图像,这并不完全是高性能的。这可能会在以后发生变化,因为他们已经将其标记为优化。编辑:他们似乎已经切换到memcpy,应该会快一点。
问题内容: 我试图翻转图像以显示4种方式:原始(无变化),水平翻转,垂直翻转,水平+垂直翻转。 为了做到这一点,我在下面做,除了水平+垂直翻转之外,它还可以正常工作,你知道为什么它不起作用吗? 问题答案: 尝试这个: 以前没有用,因为您在CSS中覆盖了。因此,它没有执行全部操作,而是执行了最后一个操作。有点像如果您执行两次,它将覆盖第一个。
问题内容: 浏览器下载了未使用的CSS图像还是将其忽略? 例如。在不符合任何元素的CSS规则中。 还是这取决于浏览器? 问题答案: 这将取决于浏览器,因为这是他们决定实施规范的方式,但是在此处进行快速测试: Chrome: 不会 FireFox: 不 Safari: 不会 IE8: 不会 IE7: 不会 IE6: 未知 (有人可以测试并发表评论吗?)
问题内容: 我在div中垂直对齐图像时遇到问题 据我所知,我需要“显示:块;” 定位图像在中心,这是可行的。同样在教程中,我找到了很多答案,但它们并不是“有用的”,因为我的所有图像都不在同一高度! 问题答案: 如果容器中的高度固定,则可以将line-height设置为与高度相同,并且它将垂直居中。然后只需添加text-align使其水平居中即可。 编辑 您的代码应如下所示: 更新 现在是2016年
问题内容: 从逻辑上讲是这样(但是只要字符编码或语言环境在起作用,逻辑就无关紧要了)。根据 打印“ y”,是的。根据 用java 返回,不是。如果没有这个帖子声称这一点,这根本不会让我感到困惑 Sun为JDK7更新的Pattern类具有一个奇妙的新标志UNICODE_CHARACTER_CLASS,它使所有功能再次正常运行。 但是我正在使用Java版本“ 1.7.0_07”,并且该标志存在并且似乎
问题内容: 我一直在试图弄清楚如何翻转图像,但是还没有弄清楚。 我使用画一个与 我只需要一种在水平或垂直轴上翻转图像的方法。 如果您愿意,可以查看github上的完整源代码。 问题答案: 来自http://examples.javacodegeeks.com/desktop-java/awt/image/flipping-a- buffered-image :
我正在尝试加载.jpg图像作为背景,我用stbi_load加载了它,但是当我尝试绘制纹理时,我得到以下错误:在0x69ABF340(nvoglv32.dll)抛出的异常0xC0000005:访问违规读取位置0x0C933000。发生 我尝试在加载图像时更改频道,也许图像不在rgb中而是在rgba中,但没有成功。 窗口应该包含指定的纹理,相反,我得到了一个白色窗口,但有一个例外。