如何使用SDL,OpenGL和C加载具有透明度的.png图像?
发布时间:2020-12-16 10:19:45 所属栏目:百科 来源:网络整理
导读:我正在尝试加载并显示一个具有透明度的.png图像.整个图像不透明,它只是我在Photoshop中裁剪的包的图片,周围有透明度.我需要将它加载到我在C上使用SDL和OpenGL的程序,但是当我尝试它而不是正确显示时,图像中包的空间是“模糊的”(我只能这样说).我所说的是,透
我正在尝试加载并显示一个具有透明度的.png图像.整个图像不透明,它只是我在Photoshop中裁剪的包的图片,周围有透明度.我需要将它加载到我在C上使用SDL和OpenGL的程序,但是当我尝试它而不是正确显示时,图像中包的空间是“模糊的”(我只能这样说).我所说的是,透明度不起作用.
到目前为止这是我的代码: 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 2n"); } // 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 2n"); } // 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 breakn"); // 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,nOfColors,surface->w,surface->h,texture_format,GL_UNSIGNED_BYTE,surface->pixels ); } else { printf("SDL could not load bag.png: %sn",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_LINEAR); // Use nice (linear) scaling glTexParameteri(GL_TEXTURE_2D,GL_LINEAR); // Use nice (linear) scaling glBegin (GL_QUADS); glNormal3f(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,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,0.0f); //top left glEnd(); glDisable(GL_TEXTURE_2D); glutSwapBuffers(); 解决方法
您需要启用混合以使透明度起作用:
glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); 此外,您应该检查加载的PNG文件是否包含Alpha通道. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容