電腦遊戲製作開發設計論壇 首頁 電腦遊戲製作開發設計論壇
任何可以在PC上跑的遊戲都可以討論,主要以遊戲之製作開發為主軸,希望讓台灣的遊戲人有個討論、交流、教學、經驗傳承的園地
 
 常見問題常見問題   搜尋搜尋   會員列表會員列表   會員群組會員群組   會員註冊會員註冊 
 個人資料個人資料   登入檢查您的私人訊息登入檢查您的私人訊息   登入登入 

Google
[轉貼自程式設計俱樂部]glut 教學 - 吾說,要有光,就有了光

 
發表新主題   回覆主題    電腦遊戲製作開發設計論壇 首頁 -> 遊戲程式高級班:DirectX、OpenGL及各種圖型函式庫
上一篇主題 :: 下一篇主題  
發表人 內容
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 );
回頂端
檢視會員個人資料 發送私人訊息
從之前的文章開始顯示:   
發表新主題   回覆主題    電腦遊戲製作開發設計論壇 首頁 -> 遊戲程式高級班:DirectX、OpenGL及各種圖型函式庫 所有的時間均為 台灣時間 (GMT + 8 小時)
1頁(共1頁)

 
前往:  
無法 在這個版面發表文章
無法 在這個版面回覆文章
無法 在這個版面編輯文章
無法 在這個版面刪除文章
無法 在這個版面進行投票
可以 在這個版面附加檔案
可以 在這個版面下載檔案


Powered by phpBB © 2001, 2005 phpBB Group
正體中文語系由 phpbb-tw 維護製作