OpenGL,等轴测2D贴图和纹理
在OpenGL中,我正在绘制二维等轴测网格。(图片:)。请不要介意这些草率的代码,因为很多这只是尝试,在我正确地编写实际引擎的平铺部分之前,我正试图用这些东西弄脏我的手 每个瓷砖宽76像素,高38像素。现在,我想用我制作的草纹理对每个瓷砖进行纹理处理。然而,这不会好的 我的问题是,纹理看起来总是一团糟。它比它应该的要小得多(大概是它的一半大小),周围是白色的。这是我用来应用纹理的代码(当然,它的大小是76x38!) 这是计算X和Y的代码部分OpenGL,等轴测2D贴图和纹理,opengl,textures,Opengl,Textures,在OpenGL中,我正在绘制二维等轴测网格。(图片:)。请不要介意这些草率的代码,因为很多这只是尝试,在我正确地编写实际引擎的平铺部分之前,我正试图用这些东西弄脏我的手 每个瓷砖宽76像素,高38像素。现在,我想用我制作的草纹理对每个瓷砖进行纹理处理。然而,这不会好的 我的问题是,纹理看起来总是一团糟。它比它应该的要小得多(大概是它的一半大小),周围是白色的。这是我用来应用纹理的代码(当然,它的大小是76x38!) 这是计算X和Y的代码部分 for (int y = 1; y < grid
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);
}
}
(屏幕尺寸X和屏幕尺寸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();
结果:使用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通道加载纹理,如果alpha通道仍不工作,请确保opengl纹理中存在alpha通道。使用GL\u texture\u 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通道加载纹理,如果它仍然不起作用,请确保alpha通道存在于opengl纹理中。我已经尝试过了,但是纹理仍然会出现问题。我可以告诉你在那种情况下是什么样子的。你把纹理坐标夹在0和1之间了吗?尝试只使用0和1,看看纹理是否完全显示在每个瓷砖中,如果没有,则说明其他问题…@Jesse,该图像看起来不错。它应该是什么样子?@Jesse,你能把你的原始纹理作为一张图片贴在这里吗。我不知道你是怎么做的。谢谢,等我回到电脑前,我会试一试的。不过可能就是这样。OpenGL对我来说已经有一段时间了,对我来说,一切都回到了我的身边!为你的帮助干杯!我试过了,但是纹理还是坏掉了。我可以告诉你在那种情况下是什么样子的。你把纹理坐标夹在0和1之间了吗?尝试只使用0和1,看看纹理是否完全显示在每个瓷砖中,如果没有,则说明其他问题…@Jesse,该图像看起来不错。它应该是什么样子?@Jesse,你能把你的原始纹理作为一张图片贴在这里吗。我不知道你是怎么做的。谢谢,等我回到电脑前,我会试一试的。不过可能就是这样。OpenGL对我来说已经有一段时间了,对我来说,一切都回到了我的身边!为你的帮助干杯!