satanupup 喜歡上這裡的冒險者
註冊時間: 2007-05-29 文章: 80
68.10 果凍幣
|
發表於: 2007-6-28, PM 2:09 星期四 文章主題: [轉貼自程式設計俱樂部]glut 教學 - 吾說,要有光,就有了光 |
|
|
作者 : ma_hty(白老鼠(Gary))
起初 吾學習 OpenGL.
腦袋是空虛混沌, 視窗淵面黑暗. 吾的靈運行在網絡上.
吾說, 要有光, 就有了光...
沒錯了, 今次要說的, 就是 光源.
光的反映, 對於人眼去解讀立體模型是很重要的一個提示.
在上一個教學, 我們學會了繪畫一個 wire teapot, 今次, 我們改為繪畫 solid teapot. 並且為之打光.
好, 我們看源碼了.
-----------------------------------------
/////////////////////////
// glutTest07.cpp
//
// Created by Gary Ho, ma_hty@hotmail.com, 2005
//
#include <stdio.h>
#include <math.h>
#include "glut.h"
#define G_PI 3.14159265358979323846f
void prepare_lighting();
void display();
void keyboard(unsigned char key, int x, int y);
float theta, phi;
void main()
{
theta = G_PI/2;
phi = -G_PI/2;
glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH | GLUT_RGB );
glutInitWindowSize( 640, 640 );
glutCreateWindow( "hihi" );
glutDisplayFunc(display);
glutKeyboardFunc( keyboard );
prepare_lighting();
glutMainLoop();
}
void keyboard(unsigned char key, int x, int y)
{
switch( key )
{
case 'w':
theta -= .05;
prepare_lighting();
glutPostRedisplay();
break;
case 's':
theta += .05;
prepare_lighting();
glutPostRedisplay();
break;
case 'a':
phi -= .05;
prepare_lighting();
glutPostRedisplay();
break;
case 'd':
phi += .05;
prepare_lighting();
glutPostRedisplay();
break;
};
}
void display()
{
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective( 20, 1, 0.1, 10 );
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(
0,0,1,
0,0,0,
0,1,0 );
glEnable( GL_LIGHTING );
glEnable( GL_DEPTH_TEST );
glutSolidTeapot( .1 );
glutSwapBuffers();
}
void prepare_lighting()
{
theta = fmodf( theta, 2*G_PI );
phi = fmodf( phi, 2*G_PI );
float light_diffuse[4] = {1.0, 1.0, 1.0, 1.0};
float mat_diffuse[4] = {1.0, 1.0, 1.0, 1.0};
float light_position[4] = { sinf(theta) * cosf(phi), cosf(theta), -sinf(theta) * sinf(phi), 0 };
glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
glLightfv(GL_LIGHT0, GL_POSITION, light_position);
glEnable( GL_LIGHT0 );
}
----------------------------
這個範例, 你可以按鍵 'w' 's' 'a' 'd' 去改變光源的方向.
------------------
這個範例, 基本上就是承接著上一個範例, 加上一些簡單的鍵盤介面而且. 這些部份, 我不再多加解釋了.
---------------
OpenGL 內建同時支援 8 個光源, 每光源都可以再個別設定它的 ambient, diffuse, specular 和 燈光位置.
OpenGL 的燈光效果, 是由一條簡單的方程式計算出來的, 即
ambient + diffuse * dot(N,L) + specular * pow( dot(N,L), shininess )
N 就是立體模型表面上某一點的 法線.
L 是燈光方向.
ambient 是一個顏色 經由 GL_AMBIENT 去設定
diffuse 是一個顏色 經由 GL_DIFFUSE 去設定
specular 是一個顏色 經由 GL_SPECULAR 去設定
shininess 是一個數值 經由 GL_SHININESS 去設定
-----------------------
除了設定光源的設定值, 你還要指示 OpenGL 計算燈光效果時使用它, 即
glEnable( GL_LIGHT0 );
當然, 別忘記指示 OpenGL 使用燈光效果, 即
glEnable( GL_LIGHTING ); |
|