OpenGL學習筆記(12)基本光照

weixin_34219944發表於2010-10-26

 

比較這兩個球

image

在現實生活中,比如一個表面是白色的球體,假設背景是黑色,然後沒有任何燈光的照射那麼就如右側的圓一般,但這在有點不可能.現實中我們看到的都是左側這樣帶有光照的球體,所以右側的形狀只能是幾何體,無法模擬真實世界的球體.

下面我們來看一下一些基本的概念

首先定一個白色的球體

如下圖

image

注意這是一個球體,但背面也是白色的,你看不到.

啟用光照功能

依然是glEnable函式,引數是GL_LIGHTING

現在的效果

image

到這一步不行,還要為球體增加光源

建立光源

要使用光源必須先啟用光源,使用glEnable函式啟用GL_LIGHT0-7的光源,所以一共可以啟用8個光源.

glLight方法用於建立光源,其可以設定與光相關的一些引數,如下

image

如設定光源位置

GLfloat light_position[] = { 1.0, 1.0, 1.0, 0.0 };
glLightfv(GL_LIGHT0, GL_POSITION, light_position);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);

現在效果如下

image

感覺好多了

建立多光源

即設定多個光源,真實世界中往往會有很多的光源.即啟用了多個光源

GLfloat light_position[] = { 1.0, 1.0, 1.0, 0.0 };
glLightfv(GL_LIGHT0, GL_POSITION, light_position);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
 GLfloat light1_ambient[] = { 0.2, 0.2, 0.2, 1.0 };
 GLfloat light1_diffuse[] = { 1.0, 1.0, 1.0, 1.0 };
 GLfloat light1_specular[] = { 1.0, 1.0, 1.0, 1.0 };
 GLfloat light1_position[] = { -2.0, 2.0, 1.0, 1.0 };
 GLfloat spot_direction[] = { -1.0, -1.0, 0.0 };
 glLightfv(GL_LIGHT1, GL_AMBIENT, light1_ambient);
 glLightfv(GL_LIGHT1, GL_DIFFUSE, light1_diffuse);
 glLightfv(GL_LIGHT1, GL_SPECULAR, light1_specular);
 glLightfv(GL_LIGHT1, GL_POSITION, light1_position);
 glLightf(GL_LIGHT1, GL_CONSTANT_ATTENUATION, 1.5);
 glLightf(GL_LIGHT1, GL_LINEAR_ATTENUATION, 0.5);
 glLightf(GL_LIGHT1, GL_QUADRATIC_ATTENUATION, 0.2);
 glLightf(GL_LIGHT1, GL_SPOT_CUTOFF, 45.0);
 glLightfv(GL_LIGHT1, GL_SPOT_DIRECTION, spot_direction);
 glLightf(GL_LIGHT1, GL_SPOT_EXPONENT, 2.0);
 glEnable(GL_LIGHT1);

如上啟用了GL_LIGHT0和GL_LIGHT1,其兩個預設值並不相同

材質(glMaterial)

陽光照到一塊木板上和照到一個金屬上的反應是不一樣的,金屬表面則會出現光澤,所以說不同材質的物體,產生光照的效果則會不同,以下是定義了材質以後效果,出現了一些光澤

image

face can be GL_FRONT, GL_BACK, or GL_FRONT_AND_BACK to indicate to which faces of the object the material should be applied
可以定義材質(正反面)以下的一些特性

image

光照模型(glLightModel)

4個點

• The global ambient light intensity
• Whether the viewpoint position is local to the scene or should be considered to be an infinite distance away
• Whether lighting calculations should be performed differently for both the front and back faces of objects
• Whether the specular color should be separated from ambient and diffuse colors and applied after the texturing operation

只能先基本有個概念了,先看得懂api在幹嘛

相關文章