0

我一直在尝试使用 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);
}
4

2 回答 2

0

您正在绘制一个带有一种纹理的四边形。您希望在半透明部分中看到什么?背景颜色?

或者你的桌面,或者下面的窗口?这需要相当多的额外工作。

首先,您需要一个正在运行的合成器(在 Windows 上,这需要带有 Aero 的 Windows Vista 或更高版本)。

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

于 2013-09-10T16:32:50.783 回答
0

您可以检查纹理格式是否应该是 RGBA,并且您可以测试具有 128 的 alpha 通道的白色纹理 (RGB(255,255,255)),因此整个纹理只是带有 alpha 半白色的白色。在黑色背景上绘制它应该会导致绘制半白色纹理。

此外,顶点位置可能不正确,您可以尝试这样的事情(使用单位矩阵进行投影和世界变换)以查看 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 );

希望这可以帮助。拉兹万。

于 2013-09-10T16:45:23.260 回答