2020年4月15日 星期三

懶得想標題 Week08

打光程式


開起執行檔 : 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函式

--------------------------------------------------------------------------------

///打光: 這次我們要拿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:重畫畫面

}
int main(int argc, char**argv)
{

    glutInit(&argc, argv);

    glutInitDisplayMode(GLUT_DOUBLE|GLUT_DEPTH);

    glutCreateWindow("week08");

    glutDisplayFunc(display);

    glutMotionFunc(motion);///Todo: 讓mouse motion可以改變光源位置

///裡面要有打光程式
///在main()裡面
    glEnable(GL_DEPTH_TEST);///記得剪貼這行
///開啟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();

}
----------------------------------------------------------------------------------------------------------
執行結果:

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 };

反射角的光(反射到眼睛的突出亮點)


沒有留言:

張貼留言