14

AとBの2つのモデルと、Lの1つのライトがあります。モデルAにモデルBに影を付けてもらいたいです。今のところ、シャドウボリュームや適切なシャドウを気にせず、単純な円の影だけにします。十分であろう。その結果、モデルAはシャドウキャスティングの目的で球として扱われます。

これが私がアルゴリズムをどのように想像するかです:

モデルBの三角形ごとに、三角形を描画します。LからAまでの線に沿って三角形に円を投影し、三角形の距離に応じて円のサイズを大きくします。円が三角形の境界にクリップされていることを確認します(何らかの方法でステンシルバッファを使用していると思います)。

私はOpenGLとプレーンCで作業しています。

私が読むことができるいくつかのリファレンスドキュメントへのポインタはありますか?または実装のアイデア?

4

2 に答える 2

8

OpenGLがあなたに代わって作業を行うことができるので、正しいシャドウを実装する方が実際には簡単だと思います。

ここで多くのドキュメントを含む動作するシャドウコードを見つけました:http ://www.opengl.org/resources/code/samples/mjktips/TexShadowReflectLight.html

上記のコードは、オブジェクトを2回レンダリングします。最初は通常、次に特別なマトリックスを使用します。マウスによる制御や反射など、無関係なことをたくさん行います。それで、ここに興味深い部分があります。

これにより、シャドウマトリックスが計算されます。

/* Create a matrix that will project the desired shadow. */
void
shadowMatrix(GLfloat shadowMat[4][4],
  GLfloat groundplane[4],
  GLfloat lightpos[4])
{
  GLfloat dot;

  /* Find dot product between light position vector and ground plane normal. */
  dot = groundplane[X] * lightpos[X] +
    groundplane[Y] * lightpos[Y] +
    groundplane[Z] * lightpos[Z] +
    groundplane[W] * lightpos[W];

  shadowMat[0][0] = dot - lightpos[X] * groundplane[X];
  shadowMat[1][0] = 0.f - lightpos[X] * groundplane[Y];
  shadowMat[2][0] = 0.f - lightpos[X] * groundplane[Z];
  shadowMat[3][0] = 0.f - lightpos[X] * groundplane[W];

  shadowMat[X][1] = 0.f - lightpos[Y] * groundplane[X];
  shadowMat[1][1] = dot - lightpos[Y] * groundplane[Y];
  shadowMat[2][1] = 0.f - lightpos[Y] * groundplane[Z];
  shadowMat[3][1] = 0.f - lightpos[Y] * groundplane[W];

  shadowMat[X][2] = 0.f - lightpos[Z] * groundplane[X];
  shadowMat[1][2] = 0.f - lightpos[Z] * groundplane[Y];
  shadowMat[2][2] = dot - lightpos[Z] * groundplane[Z];
  shadowMat[3][2] = 0.f - lightpos[Z] * groundplane[W];

  shadowMat[X][3] = 0.f - lightpos[W] * groundplane[X];
  shadowMat[1][3] = 0.f - lightpos[W] * groundplane[Y];
  shadowMat[2][3] = 0.f - lightpos[W] * groundplane[Z];
  shadowMat[3][3] = dot - lightpos[W] * groundplane[W];

}

私はこれを完全に理解しているふりをしません。lightposは光源の位置です。グランドプレーンの最初の3つの座標は、地表面の法線ベクトルです。4番目はオフセットです(0,0,0からの距離)。

そして、この部分は実際に影をレンダリングします:

glPushMatrix();
/* Project the shadow. */
glMultMatrixf((GLfloat *) floorShadow);
drawDinosaur();
glPopMatrix();

これを機能させるには、最初にglEnable / glDisableを実行する必要があることがいくつかあるので、リンクを確認してください。

于 2009-07-11T23:49:53.373 に答える
-1

このペーパーでは、OpenGLとハードウェアアクセラレーションを使用して詳細なシャドウマップを作成し、要件をカバーしているようです。

これを達成しようとすると、レイキャスティングを使用したくなるでしょう。Bの三角形ごとに、三角形からライトへのベクトルを作成します。途中で何かにぶつかると、影になります。あなたがまともな加速構造と速い三角形のヒットテストを使用していない限り、これはちょっと遅いでしょう。私はバウンディングボリューム階層が好きです; 多くのプログラムは、衝突検出にもそれらを使用します。

于 2009-07-12T12:20:59.833 に答える