2

openGL を使用していない背景の上に半透明の長方形を描画しようとしている状況があるため、ブレンドを使用できません。一部の人が推奨するように、「スクリーンドアの透明度」効果にポリゴン点描を使用することにしました。私のマシンや他のいくつかのマシンでは問題なく動作しますが、少し古い Intel グラフィックス カードを搭載した一部のマシンでは、四角形をまったくレンダリングできません。ポリゴン スティプルをオフにすると、うまくレンダリングされます (ただし、スティプルはありません)。マシン間で影響を与える可能性があると思われる状態変数 (コードを参照) の多くを比較しましたが、それらはすべて同じであり、エラーは発生しません。

static const GLubyte stipplePatternChkr[128];  //definition omitted for clarity
                                               //but works on my machine

 // stipple the box
        glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
        glColor4ubv(Color(COLORREF_PADGRAY));
    glEnable(GL_POLYGON_STIPPLE);
    glPolygonStipple(stipplePatternChkr);
        CRect rcStipple(dim);
        rcStipple.DeflateRect(padding - 1, padding - 1);
        glBegin(GL_QUADS);
            glVertex2i(rcStipple.left, rcStipple.bottom);
            glVertex2i(rcStipple.right, rcStipple.bottom);
            glVertex2i(rcStipple.right, rcStipple.top);
            glVertex2i(rcStipple.left, rcStipple.top);
        glEnd();
    glDisable(GL_POLYGON_STIPPLE);  

       int err = glGetError();
       if (err != GL_NO_ERROR) {
        TRACE("glError(%s: %s)\n", s, gluErrorString(err));
       }

    float x;
    glGetFloatv(GL_UNPACK_ALIGNMENT, &x);
    TRACE("unpack alignment %f\n", x);
    glGetFloatv(GL_UNPACK_IMAGE_HEIGHT, &x);
    TRACE("unpack height %f\n", x);
    glGetFloatv(GL_UNPACK_LSB_FIRST, &x);
    TRACE("unpack lsb %f\n", x);
    glGetFloatv(GL_UNPACK_ROW_LENGTH, &x);
    TRACE("unpack length %f\n", x);
    glGetFloatv(GL_UNPACK_SKIP_PIXELS, &x);
    TRACE("upnack skip %f\n", x);
    glGetFloatv(GL_UNPACK_SWAP_BYTES, &x);
    TRACE("upnack swap %f\n", x);
4

2 に答える 2

1

フレーム バッファを使用する場合、これは非常に簡単です。フレーム バッファを作成し、その上に描画します。これで、RGBA 情報を含むテクスチャができました。そのテクスチャのピクセル データを CPU 上の配列に取得し、その背景の描画コマンドを使用して画像を描画します。このようにして、任意のシーンのアルファ情報を保持できます。
問題は、他のよりオーバーヘッドの高いソリューションほど高速ではない可能性があることです.

于 2010-05-19T10:13:55.820 に答える
1

フィルタリングをオフにして、点描テクスチャをポリゴンに適用してみてください。

于 2010-05-19T09:29:17.500 に答える