2012-08-16 85 views
2

所以基本上我正在用opengl/C++制作2D游戏。我有一个纹理映射到它的四边形,因为我不能使用两个图像的非功率(或至少我不应该)我有一个图像在两个图像的力量,我希望通过纹理映射去除多余的图像。OpenGL Y纹理坐标表现奇怪

GLfloat quadTexcoords[] = { 
    0.0, 0.0, 
    0.78125, 0.0, 
    0.78125, 0.8789, 
    0.0, 0.8789 
}; 
glGenBuffers(1, &VBO_texcoords); 
glBindBuffer(GL_ARRAY_BUFFER, VBO_texcoords); 
glBufferData(GL_ARRAY_BUFFER, sizeof(quadTexcoords), quadTexcoords, GL_DYNAMIC_DRAW); 
glBindBuffer(GL_ARRAY_BUFFER, 0); 

这是我的纹理代码。我知道没有什么特别的X坐标(0.7256)可以正常工作,并可以删除图像右侧的多余图像。但Y坐标不起作用。我调试了我的游戏,发现正确的坐标发送到着色器,但它不会映射。它似乎有时反过来工作,但它是非常不清楚的。

如果我给它一个像Y的坐标20,它会重复多次,但仍然会在四方形的顶部留下一条小白线。我没有想到它会是什么。

其他细节:我试图映射的图像是800乘450,并且它被包裹在一个尺寸为1024×512的图像中。我将800的纵横比缩放为450.我怀疑这会使差异,但你永远不知道!

谢谢你的时间。

编辑:这是一个什么发生的例子。

enter image description here

这是完整的图像(在X和Y 0到1)充分映射的蓝色部分是200个像素高,完整图像是300个像素高。

enter image description here

第二图像是(Y中即0〜0.6666)映射到Y轴上的三分之二的图像。这应该删除顶部的白色,但这不是发生的事情。我不认为这些坐标是前面的,因为我在网上获得了几个教程的映射。

+1

定义“不起作用”。 *究竟*发生了什么?纹理的分辨率是多少? – 2012-08-16 15:48:10

+0

你知道OpenGL的坐标是从**左下角(不是上)开始的,并且Y坐标随着你的增加而增加吗?所以'(0.0,0.0)'=左下,'(0.0,1.0)'=左上。我这样说是因为你提到“逆向工作”。如果你正在翻转纹理的y坐标,可能会发生奇怪的事情。 – KillianDS 2012-08-16 16:00:39

+0

我知道它从左下角开始,我已经解释了这一点。你可以看到上面坐标的顺序。告诉我你的想法 – Constan7ine 2012-08-16 16:13:48

回答

2

它似乎有时反向工作,但它是非常不清楚。

OpenGL假定左下方的视口原点以及在S方向上运行“平面内存texel值”,然后沿T方向运行的纹理坐标。实际上,这意味着,使用其中一种通常的映射,纹理的起源在左边的下部,与大多数图像处理程序中发现的左上角相反。

所以在你的情况下,你看到的白色边缘只是你可能应用到底部纹理图像的填充,而不是顶部,你应该放在哪里。为什么你不能使用NPO2纹理?他们得到广泛支持。

+0

我可以但我想这种方式工作,因为我可以用它来制作一个spritesheet系统 – Constan7ine 2012-08-16 20:54:15

+0

嘿有效!谢谢 – Constan7ine 2012-08-16 21:02:26

0

没有真正解决您的问题,但也许去解决问题的方式:

您可以将图像扩展到1024×1024(其变形的图像),并使用0-> 1纹理坐标。由于您的四边形的宽高比为800x450,因此图像应正确显示。

+0

好主意,但我仍然需要解决老问题,因为我打算使用精灵表 – Constan7ine 2012-08-16 17:19:11