透明度Opengl + SDL无法使用C ++

时间:2013-09-10 16:28:33

标签: c++ opengl sdl transparency

我一直在尝试使用SDL + OpenGL来实现透明度。

这是我的函数,初始化OpenGL和SDL,绘制图像,并创建纹理

void initGL()
{
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho( 0.0, Screen_Width,Screen_Height, 0.0, 1.0, -1.0 );
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glViewport(0, 0, Screen_Width, Screen_Height);
}

void initSDL()
{
SDL_Init(SDL_INIT_EVERYTHING);
SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8);
SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 8);
SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 8);
SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE, 8);
SDL_GL_SetAttribute(SDL_GL_BUFFER_SIZE, 32);
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
Bob=SDL_SetVideoMode(0, 0, 32, SDL_OPENGL);
Screen_Width= Bob->w;
Screen_Height= Bob->h;
SDL_WM_SetCaption("Project", NULL);;
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
}

void Texture::draw(int x1, int y1,int x2, int y2,std::string filename)
{
glClear( GL_COLOR_BUFFER_BIT );
CreateTexture(filename.c_str());
glEnable( GL_TEXTURE_2D );
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_BLEND);
glBindTexture(GL_TEXTURE_2D, Tex);
glBegin(GL_QUADS);
    glTexCoord2f(0.f, 0.f);
    glVertex2f( 0.f, 0.f );
    glTexCoord2f(1.f, 0.f);
    glVertex2f(  1920.f, 0.f );
    glTexCoord2f(1.f, 1.f);
    glVertex2f(  1920.f,  1080.f );
    glTexCoord2f(0.f, 1.f);
    glVertex2f( 0.f,  1080.f );
glEnd();
glDisable(GL_TEXTURE_2D);
SDL_GL_SwapBuffers();
}

void Texture::CreateTexture(std::string filename)
{
SDL_Surface* image =NULL;
image=IMG_Load( filename.c_str() );
glClearColor( 0, 0, 0, 0 );
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
glGenTextures(1, &Tex);
glBindTexture(GL_TEXTURE_2D, Tex);
int mode = GL_RGB;
if(image->format->BytesPerPixel == 4)
    mode = GL_RGBA;
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, 4, image->w, image->h, 0, mode, GL_UNSIGNED_BYTE, image-  >pixels);
SDL_FreeSurface(image);
}

2 个答案:

答案 0 :(得分:0)

你正在绘制一个四边形,只有一个纹理。您期望在半透明部件中看到什么?背景颜色?

或您的桌面,还是下方的窗户?这需要做一些额外的工作。

首先,您需要运行合成器(在Windows上,这需要使用Aero或更高版本的Windows Vista)。

窗口必须以某种方式配置,在合成时实际考虑其alpha通道; AFAIK SDL不接受这些准备工作。

答案 1 :(得分:0)

你可以检查纹理格式是否应该是RGBA,你可以测试alpha通道为128的白色纹理(RGB(255,255,255)),所以整个纹理只是白色的半白色。在黑色背景上绘制这样会产生半白色纹理。

此外,顶点位置可能不正确,你可以尝试这样的东西(用于投影和世界变换的单位矩阵)来查看是否所有内容都与opengl设置一致

glTexCoord2f(0.f, 0.f);
glVertex2f( 0.25f, 0.25f );
glTexCoord2f(1.f, 0.f);
glVertex2f(  0.25f,0.5f );
glTexCoord2f(1.f, 1.f);
glVertex2f(  0.5f,0.5f );
glTexCoord2f(0.f, 1.f);
glVertex2f(  0.5f,0.25f );

希望这会有所帮助。 勒兹。