我正在使用精灵动画(OpenGL + C ++)。
在混合方面遇到了一些麻烦。
我试图加载一个带有黑色背景的图像,并将其绘制在另一张没有黑块的纹理上。该图像具有Alpha通道并启用了混合。
我尝试使用不同的混合函数进行操作。但要么出现了块状图像,要么是半透明图像。
我知道如果我使用图像编辑软件将黑色背景替换为透明颜色,我可以做到这一点,但我想在不使用图像掩码的情况下使其正常工作。
以下是更好地理解我的情况的示例。
图像和错误完成的纹理: 我想要的方式: 以下是我正在使用的一些代码。我挑选了最相关的部分,因为很多代码分散在几个类中。
我试图加载一个带有黑色背景的图像,并将其绘制在另一张没有黑块的纹理上。该图像具有Alpha通道并启用了混合。
我尝试使用不同的混合函数进行操作。但要么出现了块状图像,要么是半透明图像。
我知道如果我使用图像编辑软件将黑色背景替换为透明颜色,我可以做到这一点,但我想在不使用图像掩码的情况下使其正常工作。
以下是更好地理解我的情况的示例。
图像和错误完成的纹理: 我想要的方式: 以下是我正在使用的一些代码。我挑选了最相关的部分,因为很多代码分散在几个类中。
glEnable(GL_DEPTH_TEST);
....
....
glEnable(GL_TEXTURE_2D);
/*Drawing the image with black background first*/
glBindTexture(GL_TEXTURE_2D, blockImage);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glEnable(GL_BLEND);
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
//drawing code
...
...
...
/*background texture is drawn last*/
glBindTexture(GL_TEXTURE_2D, bgImage);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glBlendFunc(GL_ONE, GL_DST_ALPHA);
//drawing code
...
glDisable(GL_BLEND);
glDisable(GL_TEXTURE_2D);
我并不需要实际的代码来完成这个任务。简单解释一下逻辑就足够了(绘制和混合的顺序)。