3
透明である.pngイメージを読み込んで表示しようとしています。全体の画像は透明ではありません。それは、私がPhotoshopで切り取った袋の写真です。その周囲に透明感があります。私はC++でSDLとOpenGLを使う私のプログラムにロードする必要がありますが、試してみると正しく表示される代わりに、イメージ内のバッグの周りのスペースが "あいまい"です(私はそのように置くことができます)。私が言っているのは、透明性が働かないということです。SDL、OpenGL、およびC++を使用して、どのように透明な.pngイメージをロードできますか?
これは、これまでの私のコードです:
のinit()メソッド:
SDL_Surface *surface;
GLenum texture_format;
GLint nOfColors;
if ((surface = IMG_Load("bag.png"))) {
// Check that the image's width is a power of 2
if ((surface->w & (surface->w - 1)) != 0) {
printf("warning: bag.png's width is not a power of 2\n");
}
// Also check if the height is a power of 2
if ((surface->h & (surface->h - 1)) != 0) {
printf("warning: bag.png's height is not a power of 2\n");
}
// get the number of channels in the SDL surface
nOfColors = surface->format->BytesPerPixel;
if (nOfColors == 4) // contains an alpha channel
{
if (surface->format->Rmask == 0x000000ff)
texture_format = GL_RGBA;
//else
//texture_format = GL_BGRA;
} else if (nOfColors == 3) // no alpha channel
{
if (surface->format->Rmask == 0x000000ff)
texture_format = GL_RGB;
//else
//texture_format = GL_BGR;
} else {
printf("warning: the image is not truecolor.. this will probably break\n");
// this error should not go unhandled
}
// Have OpenGL generate a texture object handle for us
glGenTextures(1, &texture);
// Bind the texture object
glBindTexture(GL_TEXTURE_2D, texture);
// Set the texture's stretching properties
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
// Edit the texture object's image data using the information SDL_Surface gives us
glTexImage2D(GL_TEXTURE_2D, 0, nOfColors, surface->w, surface->h, 0,
texture_format, GL_UNSIGNED_BYTE, surface->pixels);
}
else {
printf("SDL could not load bag.png: %s\n", SDL_GetError());
SDL_Quit();
//return 1;
}
// Free the SDL_Surface only if it was successfully created
if (surface) {
SDL_FreeSurface(surface);
}
drawScene()メソッド:
float xMin, xMax, yMin, yMax;
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef(0.0f, 0.0f, -6.0f);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, texture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); // Use nice (linear) scaling
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); // Use nice (linear) scaling
glBegin (GL_QUADS);
glNormal3f(0.0f, 0.0f, 1.0f);
if (texturesOn) glTexCoord2f(0.0f, 1.0f);
glVertex3f(4.3f, -3.5f, 0.0f); //bottom left
if (texturesOn) glTexCoord2f(1.0f, 1.0f);
glVertex3f(5.3f, -3.5f, 0.0f); //bottom right
if (texturesOn) glTexCoord2f(1.0f, 0.0f);
glVertex3f(5.3f, -4.5f, 0.0f); //top right
if (texturesOn) glTexCoord2f(0.0f, 0.0f);
glVertex3f(4.3f, -4.5f, 0.0f); //top left
glEnd();
glDisable(GL_TEXTURE_2D);
glutSwapBuffers();
乾杯、それを解決!質問を投稿する前にオンラインで調べましたが、答えを見つけられませんでした。問題が見つかるとすぐに質問を投稿する人々の一人ではないと思います。私はそれをどこにも見つけられないだろうかと思っていた。 – OddCore