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

テクスチャ フォーマットが RGBA であることを確認し、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 );

お役に立てれば。ラズヴァン。

于 2013-09-10T16:45:23.260 に答える
0

1 つのテクスチャで正確に 1 つのクワッドを描画しています。半透明の部分に何が見えると思いますか? 背景色?

またはあなたのデスクトップ、またはその下のウィンドウ?それにはかなりの追加作業が必要です。

まず、コンポジターを実行する必要があります (Windows では、Aero を搭載した Windows Vista 以降が必要です)。

また、合成時にアルファチャンネルが実際に考慮されるように、ウィンドウを構成する必要があります。私の知る限り、SDLはそれらの準備をしていません。

于 2013-09-10T16:32:50.783 に答える