我对OpenGL有点新意。我正在制作一个2D应用程序,我定义了一个Quad类,它定义了一个带有纹理的正方形。它从纹理图集加载这些纹理,并且正确地执行此操作。一切都适用于常规纹理,纹理显示正确,但在纹理图像不是正方形时无法正确显示。
例如,我希望Quad具有星形纹理,并且要显示星形,并且星形图像周围仍然位于Quad中的区域是透明的。但最终发生的事情是这颗恒星显得很好,然后它背后是我的纹理图集中填充Quad的另一种纹理。我假设它背后的纹理只是我加载到系统中的最后一个纹理?无论哪种方式,我都不希望这种纹理出现。
这就是我的意思。我想要明星,但不是它背后的云纹理出现:
我的渲染功能的重要部分是:
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);
答案 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);
我不是专家,但这确实解决了你所遇到的问题。