1

私の最後のいくつかの質問を見たことがあれば、私が OpenGL を使用して地形に関する作業を行ってきたことを知っているでしょう。頂点アルファと複数のレンダー パスを使用して、タイル化された高さマップで 1 つのテクスチャを別のテクスチャにブレンドしようとして失敗しました... その代わりに、別の計画があります。

私の WorldQuad オブジェクトには、'bottom' 変数と 'top' 変数があり、どちらも Texture 型です。これは、OpenGL テクスチャをラップする JOGL 提供のクラスです。それをロードしてから、enable() を呼び出して glEnable(GL_TEXTURE_2D) を実行し、bind() を呼び出してバインドを実行できます。

また、別のテクスチャを格納する独自のタイプの alphaMap 変数もあります。ただし、これはテクスチャ内部フォーマット GL_ALPHA8 です (つまり、アルファ値のみを持つテクスチャです)。現在、これをプログラムで生成して、ピクセルパーフェクトにしています。

次に、アルファ マップに従って下部と上部のテクスチャを結合するために、OpenGL の「テクスチャ結合」(またはテクスチャ スプラッティングと呼ばれることもあります) を使用します。

問題は、それが美しく機能したことです!!...私の仕事用ラップトップで。これは、統合された Intel チップ (GMA950 など) を搭載した IBM Thinkpad T400 です。しかし、ディスクリート NVIDIA GeForce Go 7900GS カードを搭載した Dell Inspiron E1705 に戻ってきたところ、私のプログラムはクワッドを「下」テクスチャでのみレンダリングすることがわかりました。あたかもアルファがまったく適用されていないかのようです。ここでは、2 台のデスクトップと別のラップトップでも試してみました。デスクトップの 1 つがクラッシュし、別のデスクトップではクワッドが完全に白く表示され (これは古い GeForce チップで、おそらく OpenGL 2 などをサポートしていません)、もう 1 つのラップトップは私のものと同じように動作しました。下部のテクスチャで覆われたクワッド。

グラフィック カードが何らかの理由で GL_ALPHA8 テクスチャを好まなかった場合に備えて、アルファ マップ形式を GL_RGBA に変更しようとしました。また、alphamap を含む個々のテクスチャを使用して通常のクワッドを描画することにより、3 つのテクスチャがすべて存在し、レンダリングできることも確認しました。また、alphamap をファイルに出力するので、基本的にそれがそこにあり、機能していることを再確認しました。

以下は、これらすべてに基づいてクワッドを描画する関数です。コメントを追加しましたので、フォローしていただければ幸いです。問題を解決する可能性のあるものを提案してください。私は困惑しています!くだらない統合チップでは動作するのに、私のグラフィックカードでは動作しないのはなぜですか? 私は何が欠けていますか??

ありがとう!!

編集:わかりました、誰も私を助けてくれません...私は今仕事に戻り、フラッシュドライブを仕事用コンピューターに接続し、Eclipseを起動して実行ボタンを押しました...そしてうまくいきました。それから私はドライブを取り出し、それを私の個人用ラップトップ (今日仕事に持ってきたもの) に入れ、まったく同じことをしましたが、それはただの赤い塊です。しかし、ここで、私はそれを文書化しました。まず、glGetString(GL_EXTENSIONS) からの出力が 2 台のコンピューター間で比較されました

次に、壊れた と動作している のスクリーンショット。繰り返しますが、これらはまったく同じ方法で取得されました。Eclipse を開き、実行を押して、スクリーンショットを作成します。それでおしまい。私は自分のコードに触れておらず、2 台のコンピューター間で交換したフラッシュ ドライブにコードのコピーが 1 つしかありません。どちらも同じバージョンの JDK を使用しています。

コンピューターの違いの 1 つは、私の仕事用 PC が XP を実行しており、ラップトップが Windows 7 を実行していることです。特に私は OpenGL 2 を使用しているので、両方のコンピューターが同等にサポートすると思います。実際、上記の差分ページを見ると、私の個人用ラップトップは仕事用ラップトップよりも多くの拡張機能をサポートしています。したがって、これは逆のようです。どちらかといえば、統合されたチップがテクスチャの組み合わせで詰まると思いますが、私のグラフィックカードではありません!

ヘルプ!

public void drawWorldQuad(GL2 gl, float x, float z, WorldQuad q, WorldVertex tl, WorldVertex tr, WorldVertex bl, WorldVertex br) {
    WorldVertex[] verts = new WorldVertex[] {
        bl, br, tr, tl
    };
    final float[][] texCoords = new float[][] {
            {0.0f, 0.0f},
            {1.0f, 0.0f},
            {1.0f, 1.0f},
            {0.0f, 1.0f}
    };
    final float[][] coords = new float[][] {
            {x,z},
            {x+1,z},
            {x+1,z+1},
            {x,z+1}
    };

    gl.glColor4f(1.0f, 1.0f, 1.0f, 1.0f);

    /* BEGIN TEXTURE BLENDING SECTION: */

    /* TEXTURE0 is the alpha map; a texture of type GL_ALPHA8, no rgb channels */
    gl.glActiveTexture(GL2.GL_TEXTURE0);
    q.alphaMap.getTexture().bind();
    q.alphaMap.getTexture().enable();
    gl.glTexEnvi(GL2.GL_TEXTURE_ENV, GL2.GL_TEXTURE_ENV_MODE, GL2.GL_DECAL);

    /* TEXTURE1 is the 'bottom' texture */
    gl.glActiveTexture(GL2.GL_TEXTURE1);
    q.bottom.getTexture().bind();
    q.bottom.getTexture().enable();
    // use the rgb from the bottom texture
    gl.glTexEnvi(GL2.GL_TEXTURE_ENV, GL2.GL_TEXTURE_ENV_MODE, GL2.GL_COMBINE);
    gl.glTexEnvi(GL2.GL_TEXTURE_ENV, GL2.GL_COMBINE_RGB, GL2.GL_DECAL);
    gl.glTexEnvi(GL2.GL_TEXTURE_ENV, GL2.GL_SOURCE0_RGB, GL2.GL_TEXTURE);
    gl.glTexEnvi(GL2.GL_TEXTURE_ENV, GL2.GL_OPERAND0_RGB, GL2.GL_SRC_COLOR);
    //------------------------
    // use the alpha value from the alphaMap
    gl.glTexEnvi(GL2.GL_TEXTURE_ENV, GL2.GL_COMBINE_ALPHA, GL2.GL_DECAL);
    gl.glTexEnvi(GL2.GL_TEXTURE_ENV, GL2.GL_SOURCE0_ALPHA, GL2.GL_PREVIOUS);
    gl.glTexEnvi(GL2.GL_TEXTURE_ENV, GL2.GL_OPERAND0_ALPHA, GL2.GL_SRC_ALPHA);

    /* TEXTURE2 is the 'top' texture */
    gl.glActiveTexture(GL2.GL_TEXTURE2);
    q.top.getTexture().bind();
    q.top.getTexture().enable();
    gl.glTexEnvi(GL2.GL_TEXTURE_ENV, GL2.GL_TEXTURE_ENV_MODE, GL2.GL_COMBINE);
    // interpolate between texture1 and texture2's colors, using the alpha values
    // from texture1 (which were taken from the alphamap)
    gl.glTexEnvi(GL2.GL_TEXTURE_ENV, GL2.GL_COMBINE_RGB, GL2.GL_INTERPOLATE);
    gl.glTexEnvi(GL2.GL_TEXTURE_ENV, GL2.GL_SOURCE0_RGB, GL2.GL_PREVIOUS);
    gl.glTexEnvi(GL2.GL_TEXTURE_ENV, GL2.GL_SOURCE1_RGB, GL2.GL_TEXTURE);
    gl.glTexEnvi(GL2.GL_TEXTURE_ENV, GL2.GL_SOURCE2_RGB, GL2.GL_PREVIOUS);
    gl.glTexEnvi(GL2.GL_TEXTURE_ENV, GL2.GL_OPERAND0_RGB, GL2.GL_SRC_COLOR);
    gl.glTexEnvi(GL2.GL_TEXTURE_ENV, GL2.GL_OPERAND1_RGB, GL2.GL_SRC_COLOR);
    gl.glTexEnvi(GL2.GL_TEXTURE_ENV, GL2.GL_OPERAND2_RGB, GL2.GL_SRC_ALPHA);
    //------------------------
    // interpolate the alphas (this doesn't really matter, neither of the textures
    // really have alpha values)
    gl.glTexEnvi(GL2.GL_TEXTURE_ENV, GL2.GL_COMBINE_ALPHA, GL2.GL_INTERPOLATE);
    gl.glTexEnvi(GL2.GL_TEXTURE_ENV, GL2.GL_SOURCE0_ALPHA, GL2.GL_PREVIOUS);
    gl.glTexEnvi(GL2.GL_TEXTURE_ENV, GL2.GL_SOURCE1_ALPHA, GL2.GL_TEXTURE);
    gl.glTexEnvi(GL2.GL_TEXTURE_ENV, GL2.GL_SOURCE2_ALPHA, GL2.GL_PREVIOUS);
    gl.glTexEnvi(GL2.GL_TEXTURE_ENV, GL2.GL_OPERAND0_ALPHA, GL2.GL_SRC_ALPHA);
    gl.glTexEnvi(GL2.GL_TEXTURE_ENV, GL2.GL_OPERAND1_ALPHA, GL2.GL_SRC_ALPHA);
    gl.glTexEnvi(GL2.GL_TEXTURE_ENV, GL2.GL_OPERAND2_ALPHA, GL2.GL_SRC_ALPHA);

    gl.glBegin(GL2.GL_QUADS);
    {
        for(int j=0;j<verts.length;j++) {
            // (this loop and the arrays used here are for convenience, it just draws
            // a quad; verts.length == 4)

            WorldVertex v = verts[j];

            gl.glMultiTexCoord2f(GL2.GL_TEXTURE0, texCoords[j][0], texCoords[j][3]);
            gl.glMultiTexCoord2f(GL2.GL_TEXTURE1, texCoords[j][0], texCoords[j][4]);
            gl.glMultiTexCoord2f(GL2.GL_TEXTURE2, texCoords[j][0], texCoords[j][5]);

            gl.glVertex3f(coords[j][0], (float)v.height * VERTICAL_SCALE, coords[j][6]);
        }
    }
    gl.glEnd();

}
4

1 に答える 1

4

できます!!何時間も試してみた後、ついにそれを手に入れました。

TEXTURE0 を設定した後、次の行を変更しました。

gl.glTexEnvi(GL2.GL_TEXTURE_ENV, GL2.GL_TEXTURE_ENV_MODE, GL2.GL_DECAL);

これに:

gl.glTexEnvi(GL2.GL_TEXTURE_ENV, GL2.GL_TEXTURE_ENV_MODE, GL2.GL_REPLACE);

DECAL と REPLACE の違いがまだはっきりしないので、気まぐれに変更しましたが、うまくいきました。

于 2009-07-21T13:48:10.510 に答える