看板 C_and_CPP 關於我們 聯絡資訊
開發平台(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
linotwo:亮暗是根據光源與法向量的夾角來計算。 03/29 18:38
linotwo:glRotate 之後的指令才會被影響,因此這些 case 的光源 03/29 18:40
linotwo:都沒有跟著轉。 03/29 18:40