1

私のシーンでは、球の中に立方体があります。球にRGBテクスチャを適用して半透明にしたいのですが。テクスチャをインポートして球に適用し、半透明にすることはできますが、希望する結果が得られません。

私のブレンド機能はglBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA)

私の描画方法は次のとおりです。

def DrawGLScene():
    rotation1  = 60
    rotation2 = 60

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
    glEnable(GL_BLEND)
    glLoadIdentity()
    glTranslatef(0.0, 0.0, -8.0)
    glRotatef(rotation1, 1.0, 0.0, 0.0)
    glRotatef(rotation2, 0.0, 1.0, 0.0)
    glColor4f(1.0,1.0,1.0,1.0)

    glutSolidCube(2);
    glEnable(GL_COLOR_MATERIAL)
    glEnable(GL_TEXTURE_2D)
    glBindTexture(GL_TEXTURE_2D,1)
    glColor4f(1.0,1.0,1.0,0.3)
    Q=gluNewQuadric()
    gluQuadricNormals(Q, GL_SMOOTH)
    gluQuadricTexture(Q, GL_TRUE)
    glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP)
    glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP)
    gluSphere(Q, 2.35, 32, 16)
    glDisable(GL_TEXTURE_2D)

    glutSwapBuffers()

結果は次のようになります。

球の裏側と球上のアーティファクトを見ることができません

右下の部分で球の裏側しか見えなかったので、奥行きの問題があったようです。次に、立方体を描画するためにglDepthFunc(GL_LESS)を設定し、球を描画するためにglDepthFunc(GL_ALWAYS)を設定しました。

これで、立方体を通して球の背面を見ることができます

これで、球の裏側が立方体を通して表示されます。

オブジェクトに対してglDepthFunc()の複数の組み合わせを試しましたが、役に立ちませんでした。問題は、私が深さ、ブレンド、または何か他のものをどのように扱っているかに関係していますか?

編集:

glEnable(GL_CULL_FACE)最初の例でandを使用するとglCullFace(GL_BACK)、次のようになりますが、球の背面がまったく見えないため、まだ正しくありません。

カリングが有効になっている

4

2 に答える 2

1

ブレンディングとデプステストは混在しないことに注意してください。ブレンディングを行うときは、常に手動でジオメトリを遠方から近方に並べ替える必要があります。一般的な順序に依存しない透明性は、ラスターライザーではまだほとんど解決されていない問題です。


編集:Opはすでにブレンド機能を設定しました。ブレンド機能を設定する必要があります。デフォルトのものglBlendFunc(GL_ONE, GL_ZERO)は確かにあなたが望むものではありません。ほとんどの場合glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)、通常のアルファチャネルテクスチャまたはglBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA)事前に乗算されたアルファテクスチャが必要です。

于 2012-11-06T09:35:32.750 に答える
1

まず、glEnable(GL_CULL_FACE)。で球を1回描画しglCullFace(GL_FRONT)ます。立方体を描画します(カリングなし)。最後に、で球を再度描画しglCullFace(GL_BACK)ます。

于 2012-11-06T09:45:11.107 に答える