2022年4月11日 星期一

YJ week08

 打光、法向量

1.打光

-> 查http://jsyeh.org/3dcg10/

->下載win32和data



-> 把data解壓縮的資料夾放入windows解壓縮的資料夾裡

-> 點開Light Material.exe去觀察打光,並調整打光方向




-> 在左上角點滑鼠右鍵可以換圖形




-> 滑鼠上滑下滑可調整數值,調整打光方向





2.打光實作

-> 開啟GLUT專案

-> 先將原本的程式碼複製到別處,再全部刪除,先打上週基本的十行程式碼
(因為原本程式碼中有打光的程式碼可以用)

#include <GL/glut.h>
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 Light");

    glutDisplayFunc(display);
   glutMainLoop();
}

-> 複製打光程式碼

#include <GL/glut.h>

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


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 light");


    glutDisplayFunc(display);


    glEnable(GL_DEPTH_TEST);

    glDepthFunc(GL_LESS);



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


    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(); ///用來卡住

}

-> 會變成這樣



-> z加個負號,可讓光線位置改變





-> 圖中, 紅框裡的部分進行 Init 初始化

    下半部分是執行OpenGL指令,有視窗後就可以執行了



沒有留言:

張貼留言