Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Problem z przezroczystoscia tla w tworzeniu tekstu (Opengl SDL, SDL_ttf)

Ostatnio zmodyfikowano 2010-12-22 18:35
Autor Wiadomość
Savail
Temat założony przez niniejszego użytkownika
Problem z przezroczystoscia tla w tworzeniu tekstu (Opengl SDL, SDL_ttf)
» 2010-12-18 18:03:07
Witam
Uzywam Opengl i SDL. Stosuje w swoim programie:
C/C++
glEnable( GL_ALPHA_TEST );
glAlphaFunc( GL_GEQUAL, 0.5 );
i wszystko ladnie sie wyswietla oprocz tekstu ktory generuje przy pomocy SDL_ttf:
1)Tworze bitmape z poczatkowym tlem(przy wyswietlaniu ma byc przezroczyste),
2)tworze tekst,
3)blituje tekst na bitmape
4)Za pomoca quadow wyswietlam
i wyglada na to ze calosc jest uznawana jako kanal alpha bo nic sie nie wyswietla. Gdy usune jednak glAlphaFunc wyswietla sie tekst ale razem z tlem. Pytanie: Jak usunac kanal alpha z tekstu(a na tle zostawic), lub jak rozwiazac taki problem w inny sposob?
Funkcja tworzaca tekst:
C/C++
void ClassProgram::LoadFont( std::string font_name, int font_size, std::string text, int pos_x, int pos_y,
Uint8 r, Uint8 g, Uint8 b ) {
   
    if( TTF_Init() == - 1 ) exit( 0 );
   
    SDL_Surface * message = NULL;
    SDL_Surface * background = NULL;
    TTF_Font * font = NULL;
    GLuint texture;
    SDL_Color fontcolor = { r, g, b };
   
    font = TTF_OpenFont( font_name.c_str(), font_size );
    message = TTF_RenderText_Blended( font, text.c_str(), fontcolor );
   
    int w = 256;
    int h = 64;
   
    background = SDL_CreateRGBSurface( 0, w, h, 32,
    0, 0, 0, 0 );
    SDL_BlitSurface( message, 0, background, 0 );
   
    glGenTextures( 1, & texture );
    glBindTexture( GL_TEXTURE_2D, texture );
    glTexImage2D( GL_TEXTURE_2D, 0, 4, w, h, 0, GL_RGBA,
    GL_UNSIGNED_BYTE, background->pixels );
   
    /* GL_NEAREST looks horrible, if scaled... */
    glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
    glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
   
    /* prepare to render our texture */
    glBindTexture( GL_TEXTURE_2D, texture );
    glColor3f( 1, 1, 1 );
   
    /* Draw a quad at location */
    glBegin( GL_QUADS );
    /* Recall that the origin is in the lower-left corner
       That is why the TexCoords specify different corners
       than the Vertex coors seem to. */
    glTexCoord2f( 0.0f, 1.0f );
    glVertex2f( pos_x, pos_y );
    glTexCoord2f( 1.0f, 1.0f );
    glVertex2f( pos_x + w, pos_y );
    glTexCoord2f( 1.0f, 0.0f );
    glVertex2f( pos_x + w, pos_y + h );
    glTexCoord2f( 0.0f, 0.0f );
    glVertex2f( pos_x, pos_y + h );
    glEnd();
   
    /* Bad things happen if we delete the texture before it finishes */
    glFinish();
   
    SDL_FreeSurface( message );
    SDL_FreeSurface( background );
    TTF_CloseFont( font );
    TTF_Quit();
}
P-25286
DejaVu
» 2010-12-20 00:24:51
1. Czy aby napewno dobre wartości przekazujesz do funkcji glAlphaFunc()?
2. Czy Twoja tekstura z tekstem czy czymkolwiek innym posiada kanał alfa?
P-25363
Savail
Temat założony przez niniejszego użytkownika
» 2010-12-20 14:05:10
tekstura z tekstem ma model RGBA wiec posiada kanal alpha
W glAlphaFunc()zaden parametr nie daje mi w tej chwili oczekiwanego rezultatu ;((czcionka bez tla)
P-25369
DejaVu
» 2010-12-20 18:51:11
A próbowałeś wykorzystać tą teksturę z przeźroczystością po prostu na powierzchni? Może jednak nie włączyłeś odpowiednich flag do obsługi przeźroczystości?
P-25375
Savail
Temat założony przez niniejszego użytkownika
» 2010-12-22 18:35:08
hej sorry ze tak dlugo nie odpowiadalem ale nie mialem za duzo czasu. Problemu udalo mi sie rozwiazac stosujac blending zamiast glAlphaFunc():
C/C++
glEnable( GL_BLEND );
glBlendFunc( GL_ONE, GL_ONE_MINUS_SRC_ALPHA );
P-25399
« 1 »
  Strona 1 z 1