2

私は単純なカーレースゲームをコーディングしています。黒い透明なポリゴンを描画してシーンに影を追加しようとしているときに、奇妙な問題に陥っていることに気付きました。

水平面に影を描くと、遠くから見ると透けて見えます。

void PolyShadow::Draw(){
 glColor4f(0,0,0,0.5f);
  glEnable (GL_BLEND);
  glBlendFunc (GL_DST_COLOR,GL_ONE_MINUS_SRC_ALPHA);

  this->drawShadow();
 glDisable (GL_BLEND);
   shadow_initialized = true;
}

競合を回避するために、影を投影するオブジェクトに別の shadow_offset を割り当て、影を描画する前にこの呼び出しを行います

glEnable(GL_POLYGON_OFFSET_FILL);

//call to object.drawShadows()

glDisable(GL_POLYGON_OFFSET_FILL);

void Object::drawShadows(){
glPolygonOffset(-1.0-shadow_offset,-1.0-shadow_offset);
//Draw shadow
}

私も試してみました

glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

しかし、何も変わりませんでした。

前もって感謝します

4

1 に答える 1

1

ブレンディングを使用する場合は、前後にレンダリングする必要があります。そのため、モデルや三角形を z オーダーする必要があります。通常、最初にすべての不透明なものを任意の順序でレンダリングしてから、前後のものをブレンドします。

すべての影は同じ色なので、あなたにとっては悪くありません。ジオメトリをレンダリングした後、シャドウをレンダリングするだけです。
見栄えがよく、この問題がないシャドウをレンダリングするための他の方法があります (たとえば、ステンシル バッファ内のジオメトリのシャドウ部分をマークするなど)。

順序付けの問題を回避し、交差するジオメトリでも機能する、複雑なアルファ ブレンド シーン (「深度ピーリング」など) をレンダリングするいくつかの手法がありますが、かなりコストがかかります。

于 2010-12-04T18:38:00.620 に答える