2009-07-21 4 views
1

あなたが私の最後のいくつかの質問を読んだことがあれば、私はOpenGLで地形のものに取り組んでいることが分かりました。頂点のアルファと複数のレンダリングパスを使ってタイル張りの高さマップにあるテクスチャを別のテクスチャにブレンドしようとして失敗しました...だから、代わりに別の計画があります。OpenGLのテクスチャを結合していない(常に)

マイWorldQuadオブジェクトは、「ボトム」と「トップ」の変数、型テクスチャの両方を持っています。これは、OpenGLテクスチャをラップするJOGLが提供するクラスです。それは私のためにそれをロードし、次にglEnable(GL_TEXTURE_2D)を実行するためにenable()を呼び出すことができ、バインドを行うためにbind()を呼び出すことができます。

また、さらに別のテクスチャを格納し、私自身のタイプのalphamapの変数を持っています。これはテクスチャ内部形式GL_ALPHA8です(つまり、アルファ値のみのテクスチャです)。私は現在、これをプログラム的に生成してピクセルを完璧にしています。

それから私は、アルファマップに従って底部と頂部のテクスチャを合成するためにOpenGLの「テクスチャ合成」(またはテクスチャそれが時々呼ばれていますスプラッティング)を使用します。

事は、きれいに働いています!! ...私の仕事のノートパソコンに。インテルチップ(GMA950など)を搭載したIBM ThinkPad T400です。しかし、私は自分のDell Inspiron E1705に独立したNVIDIA GeForce Go 7900GSカードを持って帰ってきました。私のプログラムは「底」テクスチャで四角形をレンダリングするだけです。アルファがまったく適用されないかのようです。私はまた、2台のデスクトップともう1台のノートパソコンで試しました。デスクトップの1つがクラッシュし、別のクワッドが完全に白く表示されました(これは古いGeForceチップで、おそらくOpenGL 2などをサポートしていません)。底部のテクスチャで覆われたクワッド。

私はすでにいくつかの理由で私のグラフィックカードはGL_ALPHA8テクスチャを好きではなかった場合には、GL_RGBAにアルファマップ形式を変更しようとしました。また、3つのテクスチャがすべて存在し、アルファマップを含む各テクスチャで通常のクワッドを描画することでレンダリングできることも確認しました。私はまた、ファイルにアルファマップを出力するので、基本的にはそこにあることを確認して作業しています。

以下は、このすべてに基づいてクワッドを描画する関数です。うまくいけば私はあなたに沿って進むことができるようにコメントを追加しました。問題を解決する可能性のあることを示唆してください。私は困惑している!なぜ私はグラフィックカードではなく、駄洒な内蔵チップで動作するのですか?私は何が欠けているのですか?

ありがとうございます!

EDIT:さて、誰もが明らかに私を助けることはできません...私はすぐに戻って仕事でだが、私の仕事用のコンピュータに私のフラッシュドライブを接続し、Eclipseを起動し、実行ボタンを押して...そして、それは働きました。それから私はドライブを取り出し、私の個人的なラップトップに入れて(私は今日働くことになった)、まったく同じことをしました、そして、ちょうど赤い小塊です。しかしここで、私はそれを文書化しました。まず、the output from glGetString(GL_EXTENSIONS), diffed between the two computers

次は、screenshots of broken and workingです。 再び、これらは全く同じ方法で取得されました。オープンEclipse、プレスラン、スクリーンショット。それでおしまい。私は自分のコードに触れておらず、私のコードのコピーはフラッシュドライブに1つしかありません。どちらも同じバージョンのJDKを持っています。今

コンピュータ間の違いの一つは、私の仕事のPCはXPを実行しているし、私のラップトップは、Windows 7を実行していることは、これは実際にも違いを作るべきであるということですか?特にOpenGL 2を使用しているので、両方のコンピュータが同じようにサポートしていると思います。実際には、上のdiffページを見ると、私の個人用ラップトップは、ノートパソコンよりもさらに多くの拡張機能をサポートしています。インテリジェントに比べて7900gのnvidiaカードだからです。だから、これは逆に思える。何かがあれば、グラフィックスカードではなく、統合されたチップがテクスチャ結合で塞がることが予想されます。

ヘルプ!

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

IT WORKS !!試してみた後、ついにそれを手に入れました。これに

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

TEXTURE0を設定した後、私はこの行を変更し

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

私はまだDECALとの違いを明確におりませんので、私はちょうど、気まぐれで、それを変更交換し、それは働いた!