LWJGL纹理在显示时上下颠倒

LWJGL纹理在显示时上下颠倒,第1张

LWJGL纹理在显示时上下颠倒

大多数图像格式从上到下存储数据。除非您在加载图像时重新整理数据,否则这也是读取图像后在内存中的顺序。

从加载的图像创建OpenGL纹理时,除非明确更改顺序,否则将维持此内存顺序。因此,纹理内存中的顺序仍然是从上到下。

OpenGL确实没有图像/纹理方向。但是,当您使用纹理坐标时,它们将按照存储在内存中的顺序处理纹理。这意味着对于t坐标的两个极值:

  • t = 0.0对应于内存中图像的开始,即图像的顶部边缘。
  • t = 1.0对应于内存中图像的末尾,即图像的底部边缘。

现在,查看您的抽奖电话:

GL11.glTexCoord2f(0, 0);GL11.glVertex2f(0, 0);GL11.glTexCoord2f(1, 0);GL11.glVertex2f(256, 0);GL11.glTexCoord2f(1, 1);GL11.glVertex2f(256, 256);GL11.glTexCoord2f(0, 1);GL11.glVertex2f(0, 256);

在默认的OpenGL坐标系中,y坐标从下到上。因此,前两个顶点是四边形的底部顶点(因为它们的y坐标较小),其余两个顶点是顶部的两个顶点。

由于您对前两个顶点使用了t = 0.0,它们位于四边形的底部,并且t =
0.0对应于图像的顶部,因此图像的顶部在四边形的底部。反之亦然,对于后两个顶点(位于四边形的顶部)使用t = 1.0,并且t =
1.0对应于图像的底部。因此,您的图像看起来是颠倒的。

到目前为止,最简单的解决方法是更改​​纹理坐标。底部的两个顶点使用t = 1.0,顶部的两个顶点使用t = 0.0,图像方向现在与屏幕上四边形的方向匹配:

GL11.glTexCoord2f(0.0f, 1.0f);GL11.glVertex2f(0.0f, 0.0f);GL11.glTexCoord2f(1.0f, 1.0f);GL11.glVertex2f(256.0f, 0.0f);GL11.glTexCoord2f(1.0f, 0.0f);GL11.glVertex2f(256.0f, 256.0f);GL11.glTexCoord2f(0.0f, 0.0f);GL11.glVertex2f(0.0f, 256.0f);

另一种选择是在读入图像时翻转图像,例如,将for循环的顺序更改为:

for (int y = 0; y < image.getHeight(); y++) {

至:

for (int y = image.getHeight() - 1; y >= 0; y--) {

但是在内存中以自上而下的顺序放置图像是很常见的,如果您使用系统库/框架读取图像,则通常无法控制它。因此,使用纹理坐标在所需方向上渲染它们是一种常用的方法,并且IMHO优于将数据改组。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5142194.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-18
下一篇 2022-11-17

发表评论

登录后才能评论

评论列表(0条)

保存