大多数图像格式从上到下存储数据。除非您在加载图像时重新整理数据,否则这也是读取图像后在内存中的顺序。
从加载的图像创建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优于将数据改组。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)