打光程式
開起執行檔 : Light Material.exe
開起一個GLUT專案(一樣在桌面下載freeglut,以及之前複製的操作)
利用搜尋功能在main,cpp中搜索下列程式碼
(關鍵字:light,MATERIAL)>複製到記事本
刪除main.cpp剩餘程式碼>打上茶壺程式碼>再複製貼上先前程式碼
---------------------------------------------------------------------------------------------
///打光: 這次我們要拿177行的GLUT範例來改Ctrl-F找light
#include<GL/glut.h>
///外面有個打光的陣列 找到第1個light,是陣列的宣告,裡面有光的值
const GLfloat light_ambient[] = { 0.0f, 0.0f, 0.0f, 1.0f };
const GLfloat light_diffuse[] = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat light_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat light_position[] = { 2.0f, 5.0f, 5.0f, 0.0f };
///裡面有Material的值
const GLfloat mat_ambient[] = { 0.7f, 0.7f, 0.7f, 1.0f };
const GLfloat mat_diffuse[] = { 0.8f, 0.8f, 0.8f, 1.0f };
const GLfloat mat_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat high_shininess[] = { 100.0f };
void display()
{
glClear(GL_COLOR_BUFFER_BIT |GL_DEPTH_BUFFER_BIT);
glutSolidTeapot(0.3);
glutSwapBuffers();
}
int main(int argc, char**argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE|GLUT_DEPTH);
glutCreateWindow("week08");
glutDisplayFunc(display);
///裡面要有打光程式
///在main()裡面
glEnable(GL_DEPTH_TEST);///記得剪貼這行
///打開第1個燈光
glEnable(GL_LIGHT0);
glEnable(GL_NORMALIZE);
glEnable(GL_COLOR_MATERIAL);
glEnable(GL_LIGHTING);
///光的設定值
glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);
glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
glLightfv(GL_LIGHT0, GL_POSITION, light_position);
///Material的設定值
glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);
glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
glMaterialfv(GL_FRONT, GL_SHININESS, high_shininess);
glutMainLoop();
}
---------------------------------------------------------------------------------------------
執行結果如下:

加入motion函式
--------------------------------------------------------------------------------
GLfloat light_position[] = { 2.0f, 5.0f, -5.0f, 0.0f };///Todo:const要刪掉 加負號轉正面
///裡面要有打光程式
執行結果如下:

加入motion函式
--------------------------------------------------------------------------------
///打光: 這次我們要拿177行的GLUT範例來改Ctrl-F找light
#include<GL/glut.h>
///外面有個打光的陣列 找到第1個light,是陣列的宣告,裡面有光的值
const GLfloat light_ambient[] = { 0.0f, 0.0f, 0.0f, 1.0f };
const GLfloat light_diffuse[] = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat light_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
GLfloat light_position[] = { 2.0f, 5.0f, -5.0f, 0.0f };///Todo:const要刪掉 加負號轉正面
///裡面有Material的值 ///const表示不能動的變數
const GLfloat mat_ambient[] = { 0.7f, 0.7f, 0.7f, 1.0f };
const GLfloat mat_diffuse[] = { 0.8f, 0.8f, 0.8f, 1.0f };
const GLfloat mat_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat high_shininess[] = { 100.0f };
void display()
{
glClear(GL_COLOR_BUFFER_BIT |GL_DEPTH_BUFFER_BIT);
glutSolidTeapot(0.3);
glutSwapBuffers();
}
void motion(int x, int y)///Todo: motion函式,改 light_potion[]的值,呼叫函式
{
light_position[0]= (x-150)/150.0;///Todo: 光源的x座標 刪掉燈光放遠
light_position[0]= -(y-150)/150.0;///Todo: 光源的y座標 刪掉燈光放遠
glLightfv(GL_LIGHT0, GL_POSITION, light_position);///設定位置 Todo:我們要偷它 glutPostRedisplay();///Todo:重畫畫面
}
{
light_position[0]= (x-150)/150.0;///Todo: 光源的x座標 刪掉燈光放遠
light_position[0]= -(y-150)/150.0;///Todo: 光源的y座標 刪掉燈光放遠
glLightfv(GL_LIGHT0, GL_POSITION, light_position);///設定位置 Todo:我們要偷它 glutPostRedisplay();///Todo:重畫畫面
}
int main(int argc, char**argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE|GLUT_DEPTH);
glutCreateWindow("week08");
glutDisplayFunc(display);
glutMotionFunc(motion);///Todo: 讓mouse motion可以改變光源位置
glutMotionFunc(motion);///Todo: 讓mouse motion可以改變光源位置
///裡面要有打光程式
///在main()裡面
glEnable(GL_DEPTH_TEST);///記得剪貼這行
///開啟3D的深淺深度的測試 =>近的會蓋掉遠的
///開啟3D的深淺深度的測試 =>近的會蓋掉遠的
///打開第1個燈光
glEnable(GL_LIGHT0);
glEnable(GL_NORMALIZE);
glEnable(GL_COLOR_MATERIAL);
glEnable(GL_LIGHTING);
///光的設定值
glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);
glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
glLightfv(GL_LIGHT0, GL_POSITION, light_position);///Todo:我們要偷它
///Material的設定值
glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);
glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
glMaterialfv(GL_FRONT, GL_SHININESS, high_shininess);
glutMainLoop();
}
----------------------------------------------------------------------------------------------------------
執行結果:





沒有留言:
張貼留言