我试图绘制红皮书http://www.glprogramming.com/red/chapter14.html#name15OpenGL的阴影误
要开始简单地说,我将地方在原点投射阴影光的配方沿着以下在OpenGL阴影。
我把相机放在x,y,z = 0,1,0上,沿着-ve y轴向下看。
我0.1位于y绘制正方形0.1 = 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);
我期待看到广场上的地平面上的影子 - 一个稍大的方形。相反,我得到一个完美的空白。
我的错误是什么?
(我曾尝试翻转的阴影矩阵的值和渲染方的高度标志的每个组合。所有给我一片空白。)
(我也曾尝试与更换阴影矩阵因此这似乎排除了一个愚蠢的编码错误 - 阴影矩阵有问题。)
也许某些代数会有帮助吗?
任意地平面:
a。 x + b。 y + c。 Y + d = 0
从任何光任何顶点
x = lx + m . (vx - lx)
y = ly + m . (vy - ly)
z = lz + m . (vz - lz)
求解米
米载体= - (。的1x + B LY + C LZ + d)/ (一个VX - 的1x + 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
现在PLAC e = y = 0.5时的地平面
m = 0.5/vy
x = 0.5 . vx/vy
y = 0.5
z = 0.5 . vz/vy
这应该是顶点v的阴影撞击地面的点。事实上,手动计算这些点并将它们插入到opengl中可以获得预期的显示效果!