要获得像素完美的坐标系,您可以按如下方式设置矩阵:
glViewport(0, window_width, 0, window_height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, window_width, 0, window_height, 0, 1);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
这可确保 OpenGL 坐标到像素的 1:1 映射,并将原点放在左下角。
至于你的纹理,如果你不想依赖非二次幂扩展,你可以must将其填充为 2 的幂。尽管 OpenGL ES 规范并没有规定它也必须是正方形(据我所知),但我在 Android 上看到过奇怪的事情,纹理尺寸如 512 x 128,所以最好坚持使用square二次方纹理。
需要注意的是,OpenGL 中的纹理坐标始终介于 0 和 1 之间,无论纹理的像素大小是多少。因此,如果您的精灵宽度为 48 像素,并且将其填充为 64 x 64 的纹理,那么它将跨越从 0 到 0.75 的 x 坐标:
1 +--------+
| |
| |
+-----+ |
|\_O_/| |
| O | |
| / \ | |
0 +-----+--+
0 0.75 1 <- texture coordinates
0 48 64 <- pixels
因此,您必须为四边形的角设置这些纹理坐标。因为我们有一个像素完美的投影,所以四边形也必须正好是 48 像素宽。
总之,在位置绘制你的精灵x, y
(从左下角开始以像素为单位),执行如下操作:
float texcoord_x = (float)sprite_width / texture_width;
float texcoord_y = (float)sprite_height / texture_height;
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, texture_id);
glBegin(GL_QUADS);
// bottom left
glTexCoord2f(0, 0);
glVertex2i(x, y);
// bottom right
glTexCoord2f(texcoord_x, 0);
glVertex2i(x + sprite_width, y);
// top right
glTexCoord2f(texcoord_x, texcoord_y);
glVertex2i(x + sprite_width, y + sprite_height);
// top left
glTexCoord2f(0, texcoord_y);
glVertex2i(x, y + sprite_height);
glEnd();
我知道 OpenGL ES 没有glVertex2i
等等,所以你必须将这些坐标放入缓冲区。而且它不允许四边形,因此您必须将其分成三角形。但这是基本思想。