OpenGL,等距2D地图和纹理

时间:2011-12-29 14:20:30

标签: opengl textures

在OpenGL中,我正在绘制一个2D等距网格。 (图片:http://i.imgur.com/nUZax.png)。请不要介意这些邋code的代码,因为很多事情只是在尝试解决问题,在我正确地编写实际引擎的平铺部分之前,我正试图弄清楚这些东西。

每个图块宽76像素,高38像素。现在我想用我制作的一点草纹理纹理每个瓷砖。但是,这不太好!

我的问题是,纹理看起来一直搞砸了。它的尺寸比它应该的要小(比如尺寸的一半),它被白色包围。这是我用来应用纹理的代码(当然是76x38大小!)。

void drawSquare(int x, int y) {
    glEnable( GL_TEXTURE_2D );
    glBindTexture( GL_TEXTURE_2D, texture);
    glBegin(GL_QUADS);
        glTexCoord2i( 38, -19); glVertex2i(x+38, y);
        glTexCoord2i(-38,  19); glVertex2i(x,    y+19);
        glTexCoord2i( 38, -19); glVertex2i(x-38, y);
        glTexCoord2i(-38,  19); glVertex2i(x,    y-19);
    glEnd();
}

这是计算X和Y的代码的一部分。

for (int y = 1; y < gridY+1; y++) {
    for (int x = 1; x < gridX+1; x++) {
        drawSquare((x-y) * 38 + (SCREEN_SIZE_X/2), (x+y) * 19);
    }
}

我应该补充一点,我把我的邻居的设置都这样。

glOrtho(0, SCREEN_SIZE_X, 0, SCREEN_SIZE_Y, -1, 1);

(SCREEN_SIZE_X和SCREEN_SIZE_Y只是800x600)

任何可以帮助我的人?非常感谢。也许为了更清楚,这就是它现在的样子!

编辑: 经过一些帮助后,它已被改为。

glBegin(GL_QUADS);
//glColor3f(r, g, b);
glTexCoord2f(0,1); glVertex2i(x+38, y);
glTexCoord2f(1,1); glVertex2i(x,    y+19);
glTexCoord2f(1,0); glVertex2i(x-38, y);
glTexCoord2f(0,0); glVertex2i(x,    y-19);
glEnd();

结果:http://i.imgur.com/sOqsH.png

1 个答案:

答案 0 :(得分:3)

使用GL_TEXTURE_2D时,纹理坐标应该从0到1,而不是从-38到19。

此外,您应该使用glTexCoord2f()代替。

修改 这可能是最简单/最好的方法:只需将整个纹理绘制为单个四边形,并启用透明度(混合),只需确保纹理的边角100%透明!

注意:您仍然可以使用glTexCoord2i(),因为您始终使用整个纹理。但是如果要制作纹理图集,那么glTexCoord2f()是必要的。

void drawSquare(int x, int y) {
    glEnable(GL_TEXTURE_2D);
    glEnable(GL_BLEND);
    glBindTexture(GL_TEXTURE_2D, texture);
    glBegin(GL_QUADS);
        glTexCoord2i(0, 0); glVertex2i(x-38, y-19);
        glTexCoord2i(1, 0); glVertex2i(x+38, y-19);
        glTexCoord2i(1, 1); glVertex2i(x+38, y+19);
        glTexCoord2i(0, 1); glVertex2i(x-38, y+19);
    glEnd();
}

请记住:纹理坐标零点(0,0)是左下角

另外,不要忘记将blendmode设置为:

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

另外,请确保使用Alpha通道加载纹理,如果它仍然不起作用,请确保您的opengl纹理中存在alpha通道。