OpenGLがあなたのために仕事をすることができるので、実際には正しいシャドウを実装する方が簡単だと思います。
私はここにたくさんの文書で作業影のコードが見つかりました:http://www.opengl.org/resources/code/samples/mjktips/TexShadowReflectLight.html
上記のコードは二回、オブジェクトをレンダリングする:第1常その後、特別なマトリックスと。それは、マウスや反射のコントロールなど、無関係なことがたくさんあります。ここに興味深い部分があります。私は完全にこれを理解するふりをしていない
/* 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に必要ないくつかのものは、最初にこれが機能するためにありますので、リンクを見てください。
これは、モデルを平面上に単に「平坦化」します。平面に影を投影するのに適しています。 OPは任意の形状の3Dオブジェクトに影を描きたい。 –
これはおそらくそれを行うことができます:http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=27 残念ながら私はgccでコンパイルできません。 – stribika
このメソッドはうまくいくようですが、Bの各フェースに対してソースモデルを1回描画するコストが高いようです。この方法の複雑さを減らす方法はありますか? – Martin