我試圖繪製紅皮書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中可以獲得預期的顯示效果!