[問題] OpenGL 光照與旋轉

看板C_and_CPP (C/C++)作者 (Nestarneal)時間13年前 (2013/03/29 10:12), 編輯推噓0(003)
留言3則, 1人參與, 最新討論串1/1
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) VS 2010 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) OpenGL 問題(Question): 我想請問 OpenGL 中,旋轉會不會影響到光照呢? 我自己做的測試如下:(以下貼部分 code) CASE 1: GLfloat lightP[] = {0.0f, 0.0f, 5.0f, 1.0f}; GLfloat lightD[] = {1.0f, 1.0f, 1.0f, 1.0f}; glEnable(GL_COLOR_MATERIAL); glLightfv(GL_LIGHT0, GL_DIFFUSE, lightD); glLightfv(GL_LIGHT0, GL_POSITION, lightP); glEnable(GL_LIGHT0); glEnable(GL_LIGHTING); glColor3f(1.0f, 0.0f, 0.0f); glBegin(GL_TRIANGLES); glVertex3f(0.0f, 0.0f, 0.0f); glVertex3f(2.0f, 0.0f, 0.0f); glVertex3f(1.0f, 2.5f, 0.0f); glEnd(); 螢幕上顯示的是很亮的紅色三角形,這是預期內。 CASE 2: GLfloat lightP[] = {0.0f, 0.0f, 5.0f, 1.0f}; GLfloat lightD[] = {1.0f, 1.0f, 1.0f, 1.0f}; glEnable(GL_COLOR_MATERIAL); glLightfv(GL_LIGHT0, GL_DIFFUSE, lightD); glLightfv(GL_LIGHT0, GL_POSITION, lightP); glEnable(GL_LIGHT0); glEnable(GL_LIGHTING); glRotatef(180.0f, 0.0f, 1.0f, 0.0f); glColor3f(1.0f, 0.0f, 0.0f); glBegin(GL_TRIANGLES); glVertex3f(0.0f, 0.0f, 0.0f); glVertex3f(2.0f, 0.0f, 0.0f); glVertex3f(1.0f, 2.5f, 0.0f); glEnd(); 螢幕上顯示的是暗淡的紅色三角形。 由此我做出的結論是: 「光照會跟著座標軸一起旋轉,故此例中三角形為暗紅色但是之後的 CASE4 卻好像與結論違背。 CASE 3: GLfloat lightP[] = {0.0f, 0.0f, -5.0f, 1.0f}; GLfloat lightD[] = {1.0f, 1.0f, 1.0f, 1.0f}; glEnable(GL_COLOR_MATERIAL); glLightfv(GL_LIGHT0, GL_DIFFUSE, lightD); glLightfv(GL_LIGHT0, GL_POSITION, lightP); glEnable(GL_LIGHT0); glEnable(GL_LIGHTING); glColor3f(1.0f, 0.0f, 0.0f); glBegin(GL_TRIANGLES); glVertex3f(0.0f, 0.0f, 0.0f); glVertex3f(2.0f, 0.0f, 0.0f); glVertex3f(1.0f, 2.5f, 0.0f); glEnd(); 光源在三角形背面,因此螢幕上看到的是暗紅色三角形。 CASE 4: GLfloat lightP[] = {0.0f, 0.0f, -5.0f, 1.0f}; GLfloat lightD[] = {1.0f, 1.0f, 1.0f, 1.0f}; glEnable(GL_COLOR_MATERIAL); glLightfv(GL_LIGHT0, GL_DIFFUSE, lightD); glLightfv(GL_LIGHT0, GL_POSITION, lightP); glEnable(GL_LIGHT0); glEnable(GL_LIGHTING); glColor3f(1.0f, 0.0f, 0.0f); glRotatef(180.0f, 0.0f, 1.0f, 0.0f); glBegin(GL_TRIANGLES); glVertex3f(0.0f, 0.0f, 0.0f); glVertex3f(2.0f, 0.0f, 0.0f); glVertex3f(1.0f, 2.5f, 0.0f); glEnd(); 將座標軸轉 180 度到背面後,若由 CASE 2 的結論來看, 光源會從背面跑到正面,因此三角形應是亮紅色。 但事實上卻是暗紅色。 所以 CASE1、2 以及 CASE 3、4 會得到兩個不同的結論。 不曉得哪個才是正確的,哪個才是錯誤的呢? 想請前輩們指點指點,謝謝 :) -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.38.1.75

03/29 18:38, , 1F
亮暗是根據光源與法向量的夾角來計算。
03/29 18:38, 1F

03/29 18:40, , 2F
glRotate 之後的指令才會被影響,因此這些 case 的光源
03/29 18:40, 2F

03/29 18:40, , 3F
都沒有跟著轉。
03/29 18:40, 3F
文章代碼(AID): #1HLFY0ft (C_and_CPP)
文章代碼(AID): #1HLFY0ft (C_and_CPP)