opengl阴影错误

时间:2012-11-23 16:35:39

标签: opengl

我试图在opengl中绘制阴影以及红皮书中的食谱http://www.glprogramming.com/red/chapter14.html#name15

简单地说,我会将投射阴影的光线放在原点。

我将相机放在x,y,z = 0,1,0处,然后向下看'沿-ve y轴。

我在y = 0.1

处绘制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 )

解决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会产生预期的显示!

1 个答案:

答案 0 :(得分:0)

好的,找到了!

http://www.glprogramming.com/red/chapter14.html#name15的opengl红皮书指出阴影矩阵是

{ - d,0,0,0,0,-d,0,0,0,0,-d,0,a,b,c,0}

这不起作用。

但是,这样做:

{ - d,0,0,a,0,-d,0,b,0,0,-d,c,0,0,0,0}