2

構文エラーはないと思います。OpenGL を使用してテクスチャ付きクワッドでアルファがどのように行われるかを理解するのに問題があるだけです。(opengl 4.2であるcentos 6.3の下のmesa 9.0)

glTexImage でアップロードされたフォント フェイスがあります (GL_ALPHA、GL_RED、現在 GL_RGBA を試しました)。ピクセルをいじって手動で設定したので、アルファチャンネルが文字に設定され、背景に設定されていないことはかなり確信しています)。

したがって、明確にするために、TexImage には、文字ピクセルに赤の 0xff0000、背景ピクセルに黒の 0x000000 が含まれ、アルファは赤のピクセルで 0xff に設定され、それ以外の場合は 0x00 に設定されます。

やった:

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_FALSE );

glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA, 
    face->glyph->bitmap.width, face->glyph->bitmap.rows, 
    0, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV, new_buffer );

グリフを表示する場合:

glBindTexture(GL_TEXTURE_2D, ascii_textures[100] );

glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
//glColor4f(0.0f, 0.0f, 0.0f, 0.5f);
// Then draw the box
glBegin(GL_QUADS);
    glTexCoord2i( 0, 0 );           
    glVertex2f( ...                          // bottom left
    glTexCoord2i( 0, 1 );
    glVertex2f( ...                          // top left
    glTexCoord2i( 1, 1 );
    glVertex2f( ...                          // top right
    glTexCoord2i( 1, 0 );
    glVertex2f( ...                         // bottom right
glEnd();

私はこれを取得します(私はビデオの上に赤い「d」を描いています):

glColor なし

glColor 行のコメントを外すと、次のようになります。

glColor を使用

テクスチャを使用しない場合、半透明の暗いボックスが得られるので、明らかにブレンディングが機能しています。

OpenGL は、テクスチャからではなく、glColor4f ステートメントからアルファ値を取得しているようです。

とにかく、色ではなく質感に見えるようにするには?

私が実際に行っているのは、テクスチャとしてプリロードしたグリフをマスクまたはクリップすることです。そのため、他の方法でこれを行うことは歓迎されます (ただし、複雑な Unicode グリフが必要になるため、おそらく過剰なフォントではありません)。

4

1 に答える 1

0

I'll close this, since I did a workaround by drawing outside of OpenGL and then uploading the entire texture. Not quite what I wanted, but will work for now.

于 2013-09-23T23:25:52.907 に答える