0

2つのレイヤーを持つ円形の球を作成しています。1
つは上の明るいレイヤー(半径300)
、もう1つは暗いカラーレイヤー(半径298)です。

この球をウィンドウに描画すると、球が正しく描画されます。

次のコードは正確ではありませんopenGLが、openGL人々はそれを理解するのに問題はありません

ofImagesphericalImage; GLUquadricObj * quadric;

ofPushMatrix();

    //Sphere dark image
    ofRotateX(90);
    ofPushStyle();
    ofSetColor(43,64,105);
    sphericalImage.getTextureReference().bind();
    gluSphere(quadric, 298, 100, 100);
    ofPopStyle();

    //Sphere light image
    ofPushStyle();
    ofSetColor(255,255,255);
    sphericalImage.getTextureReference().bind();
    gluSphere(quadric, 300, 100, 100);
    ofPopStyle();
    sphericalImage.unbind();

ofPopMatrix();

ただし、問題は一部にあり、前面の画像(明るい部分)が実際に背面の球面画像を覆い隠します(暗い部分は完全には見えません)。カメラで球を回転させると、回転角/軸によっては領域が見える場合があります。このような効果が発生しないように、これを無効にします。

以前、これがopenGLのface-cullinに関連しているかどうかを考えていましたが、設定glDisable(GL_CULL_FACE)してディベールしましたが、効果はありませんでした。glEnable(GL_DEPTH_TEST);も設定されています。両方の球面画像が表示されるようにこれを無効にする方法についての提案はありますか?

4

1 に答える 1

4

あなたの問題は、半透明の表面のブレンドは深さの順序に依存しないということです。ブレンディングが有効になっている場合、これを機能させるには、顔を遠くから近くまで並べ替える必要があります。デプスバッファはそこでは役に立ちません。

幸いなことに、形状が凸型の場合は、各凸型を2回描画することで並べ替えを行うことができます。1回は前面がカリングされ(これにより遠くの裏側の面が描画されます)、次に背面がカリングされます(近い前面のみが描画されます)。ジオメトリをマトロシュカのように配置する場合は、最初に前面をカリングして外側を内側に、次に背面をカリングして外側に向かって作業します。

コードを変更すると、次のようになります

glEnable(GL_CULL_FACE);
glCullFace(GL_FRONT);

//Globe light image
ofPushStyle();
ofSetColor(255,255,255);
sphericalImage.getTextureReference().bind();
gluSphere(quadric, 300, 100, 100);
ofPopStyle();
sphericalImage.unbind(); 

//Sphere dark image
ofRotateX(90);
ofPushStyle();
ofSetColor(43,64,105);
sphericalImage.getTextureReference().bind();
gluSphere(quadric, 298, 100, 100);

glCullFace(GL_BACK);

gluSphere(quadric, 298, 100, 100);
ofPopStyle();

//Globe light image
ofPushStyle();
ofSetColor(255,255,255);
sphericalImage.getTextureReference().bind();
gluSphere(quadric, 300, 100, 100);
ofPopStyle();
sphericalImage.unbind();
于 2012-12-31T08:46:12.927 に答える