OpenGL非方形纹理

时间:2011-05-03 15:13:44

标签: opengl textures

我对OpenGL有点新意。我正在制作一个2D应用程序,我定义了一个Quad类,它定义了一个带有纹理的正方形。它从纹理图集加载这些纹理,并且正确地执行此操作。一切都适用于常规纹理,纹理显示正确,但在纹理图像不是正方形时无法正确显示。

例如,我希望Quad具有星形纹理,并且要显示星形,并且星形图像周围仍然位于Quad中的区域是透明的。但最终发生的事情是这颗恒星显得很好,然后它背后是我的纹理图集中填充Quad的另一种纹理。我假设它背后的纹理只是我加载到系统中的最后一个纹理?无论哪种方式,我都不希望这种纹理出现。

这就是我的意思。我想要明星,但不是它背后的云纹理出现:
enter image description here

我的渲染功能的重要部分是:

glDisable(GL_CULL_FACE);
glVertexPointer(vertexStride, GL_FLOAT, 0, vertexes);
glEnableClientState(GL_VERTEX_ARRAY);
glColorPointer(colorStride, GL_FLOAT, 0, colors);   
glEnableClientState(GL_COLOR_ARRAY);

glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, textureID);

glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glTexCoordPointer(2, GL_FLOAT, 0, uvCoordinates);

//render
glDrawArrays(renderStyle, 0, vertexCount);  

3 个答案:

答案 0 :(得分:3)

似乎显而易见的选择是使用RGBA纹理,并通过将Alpha通道设置为零来为这些像素设置除星形之外的所有内容(并为纹理单元启用Alpha混合)。

答案 1 :(得分:1)

使用图像处理程序。 Photoshop是一个伟大的,gimp是一个免费的。你并没有真正使用OpenGL裁剪纹理。相反,您的纹理需要事先为您的程序准备。

应该有某种非常简单的工具来移除星星之外的所有东西。删除,我的意思是让它透明,这将需要一个alpha通道。这意味着您需要确保在程序中加载纹理的方式考虑了32位颜色(RGBA - 红色,绿色,蓝色,alpha),而不仅仅是24位颜色(RGB - 红色,绿色,蓝色) )。

这将使您的明星背后的所有内容透明或透明。

此外,只是一个事后的想法,看起来你可能会从互联网上取一个受版权保护的图像并在你的游戏/程序中使用它。如果您正在做任何商业活动,我强烈建议您创建自己的纹理。

答案 2 :(得分:0)

你想调用glBindTexture(GL_TEXTURE_2D,0);映射纹理后 这里是一些代码写的例子

         // Bind the texture
    glBindTexture(GL_TEXTURE_2D, image.getID());

    // Draw a QUAD with setting texture coordinates
    glBegin(GL_QUADS);
    {
        // Top left corner of the texture
        glTexCoord2f(0, 0);
        glVertex2f(x, y);

        // Top right corner of the texture
        glTexCoord2f(image.getRelativeWidth(), 0);
        glVertex2f(x+image.getImageWidth(), y);

        // Bottom right corner of the texture
        glTexCoord2f(image.getRelativeWidth(), image.getRelativeHeight());
        glVertex2f(x+image.getImageWidth()-20, y+image.getImageHeight());

        // Bottom left corner of the texture
        glTexCoord2f(0, image.getRelativeHeight());
        glVertex2f(x+20, y+image.getImageHeight());
    }
    glEnd();
    glBindTexture(GL_TEXTURE_2D, 0);

我不是专家,但这确实解决了你所遇到的问题。