我正在尝试在opengl中绘制阴影以及红皮书中的配方http://www.glprogramming.com/red/chapter14.html#name15
简单地开始,我将在原点放置投射阴影的光。
我将相机放在 x,y,z = 0,1,0 沿 -ve y 轴“向下”看。
我在 y = 0.1 处画了一个 0.1 x 0.1 的正方形
float mx,pz,elevation;
mx = pz = elevation = 0.1;
glBegin( GL_QUADS );
glVertex3f( mx, elevation, pz);
glVertex3f( mx, elevation, pz+0.1);
glVertex3f( mx+0.1, elevation, pz+0.1);
glVertex3f( mx+0.1, elevation, pz);
glEnd();
如预期的那样显示:
现在我在 y = 0.5 处定义一个“地平面”(即大约在正方形和相机之间的中间位置。根据红皮书中的配方(如果我理解正确的话),阴影矩阵应该是:
// shadow matrix
GLfloat shadow[] = {
0.5,0,0,0,
0, 0.5,0,0,
0,0, 0.5,0,
0,1,0,0 };
所以我添加
glMatrixMode (GL_MODELVIEW);
glLoadIdentity();
glMultMatrixf( shadow );
我期待在地平面上看到正方形的阴影——一个稍大的正方形。相反,我得到了一个完美的空白。
我的错误是什么?
(我已经尝试过在阴影矩阵的值和渲染正方形的高度上翻转符号的所有组合。所有这些都给我空白。)
(我也尝试用单位矩阵替换阴影矩阵 - 原来的正方形重新出现。所以这似乎排除了一个愚蠢的编码错误 - 阴影矩阵有问题。)
也许一些代数会有所帮助?
任意地平面:
一个 。x + b 。y + c 。y + d = 0
从任何光到任何顶点的向量
x = lx + m . ( vx - lx )
y = ly + m . ( vy - ly )
z = lz + m . ( vz - lz )
求解 m
m = - (a.lx + b.ly + c.lz + d) / (a.vx -a.lx + b.vy -b.ly + c.vz -c.lx)
现在把光放在原点
m = -d / ( a . vx + b . vy + c . vz )
x = m . vx
y = m . vy
z = m . vz
现在将地平面放置在 y = 0.5
m = 0.5 / vy
x = 0.5 . vx / vy
y = 0.5
z = 0.5 . vz / vy
这应该是顶点 v 的阴影撞击地面的点。事实上,手动计算这些点并将它们插入 opengl 会得到预期的显示!