2012-11-23 88 views
0

我试图绘制红皮书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(); 

哪个显示为预期:

enter image description here

现在我在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中可以获得预期的显示效果!

回答