Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
OpenGL,等轴测2D贴图和纹理_Opengl_Textures - Fatal编程技术网

OpenGL,等轴测2D贴图和纹理

OpenGL,等轴测2D贴图和纹理,opengl,textures,Opengl,Textures,在OpenGL中,我正在绘制二维等轴测网格。(图片:)。请不要介意这些草率的代码,因为很多这只是尝试,在我正确地编写实际引擎的平铺部分之前,我正试图用这些东西弄脏我的手 每个瓷砖宽76像素,高38像素。现在,我想用我制作的草纹理对每个瓷砖进行纹理处理。然而,这不会好的 我的问题是,纹理看起来总是一团糟。它比它应该的要小得多(大概是它的一半大小),周围是白色的。这是我用来应用纹理的代码(当然,它的大小是76x38!) 这是计算X和Y的代码部分 for (int y = 1; y < grid

在OpenGL中,我正在绘制二维等轴测网格。(图片:)。请不要介意这些草率的代码,因为很多这只是尝试,在我正确地编写实际引擎的平铺部分之前,我正试图用这些东西弄脏我的手

每个瓷砖宽76像素,高38像素。现在,我想用我制作的草纹理对每个瓷砖进行纹理处理。然而,这不会好的

我的问题是,纹理看起来总是一团糟。它比它应该的要小得多(大概是它的一半大小),周围是白色的。这是我用来应用纹理的代码(当然,它的大小是76x38!)

这是计算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);
    }
}
(屏幕尺寸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对我来说已经有一段时间了,对我来说,一切都回到了我的身边!为你的帮助干杯!