2012-11-23 131 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中可以獲得預期的顯示效果!

回答