2020年4月15日 星期三

wendy_week8

電腦圖學 學習日誌

week8

主題: 打光

  • 練習: 試玩 light_material.exe
  • 練習: 從 CodeBlocks GLUT專案的177行, 拿light打光相關的陣列、函式來用
  • 介紹: ambient light, diffuse light, specular light
  • 期中考題: OpenGL必背10函式


(ㄧ) 試玩 light_material.exe


下載: win32 / data / glut.dll
→並將data和glut.dll放入win32的資料夾內





(二) 從 CodeBlocks GLUT專案的177行, 拿light打光相關的陣列、函式來用


  • 建立 GLUT 專案
  • 用 Ctrl-F 找 light


#include <GL/glut.h>


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


  • display() 顯示茶壺
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_RGB | GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("week8");
    glutDisplayFunc(display);

    glEnable(GL_DEPTH_TEST);


    glEnable(GL_LIGHT0);

    glEnable(GL_NORMALIZE);
    glEnable(GL_COLOR_MATERIAL);
    glEnable(GL_LIGHTING);

    glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);

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



}




(三)滑鼠移動改變光影

加入新的函式motion,做光源移動

void motion(int x,int y)

{

    light_position[0]= (x-150)/15.0;  光源X座標

    light_position[1]=-(y-150)/15.0;  光源Y座標

    glLightfv(GL_LIGHT0, GL_POSITION, light_position);

    glutPostRedisplay();

}

main()
{
    glutMotionFunc(motion);
}

(四) 期中考題:OpenGL必背函式


glPushMatrix();       備份矩陣
    glTranslatef(x,y,z);          移動
    glRotatef(angle, x,y,z)       旋轉
    glScalef(x,y,z);    放大縮小
    
    glBegin(GL_POLYGON);    開始畫畫
        glColor3f(r,g,b);   顏色
        glTexCoord2f(tx,ty);   貼圖座標
        glNormal3f(nx,ny,nz);   法向量
        glVertex2f(x,y);   頂點 也可 glVertex3f(x,y,z);
    glEnd();   結束畫

glPopMatrix();   還原矩陣


沒有留言:

張貼留言