在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();
答案 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通道。