2016-08-03 13 views
0

私はOpenGLの初心者で、SDL_TTFを使用してOpenGLでテキストを書き込む関数を作成しました。SDL_TTFを使用したOpenGLのテキスト

#define WINDOW_WIDTH 832 
#define WINDOW_HEIGHT 487 
#define glVertex2px(x,y) glVertex2d((double)(x) * 2.0/(double)WINDOW_WIDTH - 1.0, 1.0 - (double)(y) * 2.0/(double)WINDOW_HEIGHT); 
void glWriteText2d(TTF_Font *font,const char *text,SDL_Color color,const int x,const int y){ 
    GLuint texture; 
    SDL_Surface *surface; 
    surface = TTF_RenderText_Blended(font,text,color); 
    glGenTextures(1,&texture); 
    glBindTexture(GL_TEXTURE_2D,texture); 
    gluBuild2DMipmaps(GL_TEXTURE_2D,4,surface->w,surface->h,GL_RGBA,GL_UNSIGNED_BYTE,surface->pixels); 
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST); 
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); 
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT); 
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT); 
    GLboolean textureIsEnabled = glIsEnabled(GL_TEXTURE_2D); 
    glEnable(GL_TEXTURE_2D); 
    glColor3ub(255,255,255); 
    glBegin(GL_QUADS); 
     glTexCoord2f(0,0); 
     glVertex2px(x,y); 
     glTexCoord2f(0,1); 
     glVertex2px(x,y + surface->h); 
     glTexCoord2f(1,1); 
     glVertex2px(x + surface->w,y + surface->h); 
     glTexCoord2f(1,0); 
     glVertex2px(x + surface->w,y); 
    glEnd(); 
    if(!textureIsEnabled){ 
     glDisable(GL_TEXTURE_2D); 
    } 
} 

私はそれを使用する場合、それはテキストがあるべき場所にcolorの色で四角形を描画しますので、この機能は動作しません。ここに私の関数のコードです。それが動作するように私のコードで何を変更すべきですか?

+0

申し訳ありませんが、私は、あなたが現在試みていることをしようとする前に、まずOpenGLについてもっと知るべきだと思います。まず第一に、OpenGLにはテキスト機能が組み込まれておらず、最新のOpenGLもありません。さらに、この古いOpenGL 1.1を固定機能のパイプラインで使用しないでください。間違いなく完全に廃止されました。私は前にglVertex2pxを見たことはありません。また、私はそれについて何かを見つけることができません。最終的には、これ以上の情報なしで、この文脈から何が間違っているのかを言うのは難しいです。おそらく、モデルビュー/投影行列を間違って設定して、全体の小さな部分しか見ることができないのでしょうか? – Michael

+0

@Michael 'glVertex2px'については、SDLのようにウィンドウの左上隅からピクセル数を使って描画するマクロです。 2Dでは、私はより実用的であることがわかります。その定義をコードに含めるのを忘れましたが、修正するために編集しました。 –

答えて

2

結果のテクスチャは無地で塗りつぶされています。テキストはアルファチャンネルですが、アルファブレンディングが有効になっていないため、表示されません。

glEnable(GL_BLEND); 
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 

または少なくともアルファテストは(ブレンドの欠如に起因するシャープなエッジを生成します - 一部のフォントのために、それはさらに良くそのように見える)を追加します。

SDL_SurfaceもGLテクスチャも生成されていません。そうすればすぐにメモリが足りなくなります。テクスチャを再利用することができ、データをGLテクスチャにコピーするとすぐにSDL_Surfaceを解放することができます。

関連する問題