2

所以基本上我正在用 opengl/c++ 制作一个 2D 游戏。我有一个四边形,上面贴有纹理,因为我不能使用两个图像的非幂(或者至少我不应该),我在两个图像的幂内有一个图像,我希望使用纹理映射删除多余的图像。

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 x 450,它被包裹在大小为 1024 x 512 的图像中。我按 800 x 450 的纵横比缩放四边形。我怀疑这会有所作为,但你永远不会知道!

谢谢你的时间。

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

在此处输入图像描述

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

在此处输入图像描述

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

4

2 回答 2

2

有时它似乎在反向工作,但目前还不清楚。

OpenGL 假定视口原点位于左下方,纹理坐标与 S 中的平面内存纹理值“一起”运行,然后是 T 方向。从本质上讲,这意味着,对于通常的映射之一,纹理的原点位于左下角,这与大多数图像处理程序中的左上角原点相反。

因此,在您的情况下,您看到的白色边距只是您可能应用于底部纹理图像的填充,而不是您应该放置它的顶部。为什么你不能使用 NPO2 纹理呢?他们得到了广泛的支持。

于 2012-08-16T18:41:23.797 回答
0

不是解决问题的真正方法,但可能是解决问题的方法:

您可以将图像缩放到 1024x1024(使图像变形)并使用 0->1 纹理坐标。因为四边形的纵横比是 800x450,所以应该正确显示图像。

于 2012-08-16T17:03:40.203 回答