學習opengl(五)顏色、光照與材質
顏色、光照和材質是opengl的重要內容,其中glcolor函式設定當前的顏色,該函式之後繪製的所有頂點(圖形)都使用該顏色。對於乙個點,其顏色就是設定的顏色,而對於一條直線而言,如果兩個頂點的顏色不同,那麼兩點之間線的顏色取決於陰暗(shade)處理的模型。明暗處理的定義就是從一種顏色到另一種顏色的平滑過濾。
光滑的明暗處理(gl_smooth)讓顏色沿著直線變動,就像rgb顏色立方體中乙個顏色到另乙個顏色點的平滑果斷。在數學上,明暗處理是先找到三維rgb顏色空間中的直線方程,然後再從直線的一段到另一端進行插值提供顏色。
1)光照型別
opengl可以根據光照新增創造出跟真實世界非常接近的圖形來,除了物體本身發光以外,還可以有環境光、散射光和鏡面光三種光照。
(1)環境光(ambient)
環境光不來自任何特殊的方向,它有光源,但是被房間或場景多次反射,以至於變得沒有方向。被環境光照射的物體表面的各個方向都均等受光。
(2)散射光(diffuse)
散射光來自某個方向,被物體表面均勻反射,即使光是被均勻反射回去的,它直射的物體表面比從某個角度照射過來時要亮,比較典型的散射光源是螢光屏照明裝置或中午時攝入側窗的太陽光束。
(3)鏡面光(specular)
鏡面光跟散射光一樣有方向性,但被強烈地反射到另一特定的方向,高亮度的鏡面光往往能在被照射的物體表面產生稱之為亮斑的亮點。
2)啟用光照
通過呼叫glenalbe(gl_lighting);可以啟用光照,然後通過材質屬性和光照引數來決定場景中每個頂點的顏色。
3)設定光照模型
啟用光照後,首先需要做的第一件事就是設定光照模型,影響光照模型的三個引數是在gllightmodel函式中設定的。全域性環境光設定(gl_light_model_ambient), 該引數允許指定乙個全域性環境光,它從各個方向均勻照射所有物體,下面指定的是一種明亮的白光:
glfloat ambientlight = ;
glenable(gl_lighting);
gllightmodelfv( gl_light_model_ambient, ambientlight);
4)設定材質屬性
設定全域性環境光後,現在需要設定材質屬性時多變形能反射光。有兩種設定材質屬性的方法:
(1)在指定多邊形集合之前呼叫glmaterial()函式,如下:
glfloat gray = ;
glmaterialfv ( gl_front, gl_ambient_and_diffuse, gray);
glbegin(gl_********s);
glvertex3f( -15.0f, 0.0f, 30.0f );
glvertex3f( 0.0f, 15.0f, 30.0f );
glvertex3f( 0.0f, 0.0f, -56.0f );
glend();
glmaterial函式的第乙個引數指定材質的前面、背面(gl_front、bl_back或gl_front_and_back)或兩面屬性。第二個引數指定需要設定的屬性,上面**將環境光和散射光設定為相同的值。該種方式設定後,後續的影象材質屬性都使用最後一次設定的引數值,直到重新呼叫glmaterial為止。大多數情況下環境光和散射光的成分是相同的,一般沒必要定義鏡面反射屬性(特殊需要除外)。
(2)顏色跟蹤法
通過顏色跟蹤法,值需要通過呼叫glcolor就可以設定材質屬性,要使用顏色跟蹤法,首先必須呼叫帶有gl_color_material的glenable函式,然後glcolormaterial函式就可以根據glcolor指定的顏色值來指定材質屬性了。例項**如下:
glenable(gl_color_material);
glcolormaterial(gl_front, gl_ambient_and_diffuse);
glcolor3f( 0.75f, 0.75f, 0.75f);
glbegin(gl_********s);
glvertex3f( -15.0f, 0.0f, 30.0f );
glvertex3f( 0.0f, 15.0f, 30.0f );
glvertex3f( 0.0f, 0.0f, -56.0f );
glend();
(3)通常我們可以在setuprc()函式(不一定非得命名setuprc,只要是進行初始化的其他函式也可以)中設定環境光照射,相關**如下:
void setuprc(void)
; // white light
glenable( gl_depth_test); // hiddden su***ce removal
glenable( gl_cull_face); // do not calculate inside of jet
glfrontface( gl_ccw); // counter clock-wise polygon face out
glenable( gl_lighting);
gllightmodelfv( gl_light_model_ambient, ambientlight);
glenable( gl_color_material); // enable material color tracking
glcolormaterial( gl_front, gl_ambient_and_diffuse);
glclearcolor( 0.0f, 0.0f, 1.0f, 1.0f);
}
5)使用光源
在指定光源時,需要告訴opengl它的位置和發光的方向。對於多邊形來說,如果指定光源的方向?採用的思路:從假想的平面(或多邊形)上 的乙個頂點引出來一條垂直向上的線,叫法線向量。法線向量僅僅表示一條垂直某個真實或假象平面的線。法線向量是一條指向某方向的線,它與多邊形的表明成90°(垂直)。法線向量可以由乙個多邊形的三個頂點計算所得,如:
void reducetounit( float v[3])
opengl超級寶典(第六章)的演示示例jet的效果圖結尾:void calcnormal( float v[3][3], float out[3])
由於沒有附件功能,本示例的源**直接附後面:
// jet.cpp
// a hand modeled jet airplane
// opengl superbible
// beginning of opengl lighting sample
// program by richard s. wright jr.
#include "stdafx.h"
#include#include #include using namespace std;
// rotation amounts
static glfloat xrot = 0.0f;
static glfloat yrot = 0.0f;
// called to draw scene
void renderscene_jet(void)
// this function does any needed initialization on the rendering
// context.
void setuprc_jet()
void specialkeys_jet(int key, int x, int y)
void changesize_jet(int w, int h)
void reducetounit( float v[3])
void calcnormal( float v[3][3], float out[3])
int main(int argc, char* argv)
OpenGL基本概念入門4 顏色 光照和材質1
1 opengl中的顏色 在未使用光照系統的前提下,我們可以直接為圖元指定顏色。在傳入頂點之前呼叫glcolor函式,就可以為即將指定的頂點設定顏色。例如 glbegin gl s glcolor3ub 255,0,0 glvertex3f 0,1,0 glvertex3f 1,0,1 glvert...
OPENGL學習筆記 光照
1 隱藏表面消除 隱藏表面消除就是消除實心物體被其他物體所遮擋住的部分,最簡單的方法就是使用深度緩衝區。深度緩衝區的原理是把乙個距離觀察平面 通常是近側裁剪平面 的深度值與視窗中的每乙個畫素相關聯。首先使用glclear 函式,把所有畫素的深度值設定為最大可能的距離,然後在場景中以任意順序繪製所有的...
OpenGL學習10 OpenGL光照
在opengl模型中,除非乙個物體自己會發光,否則它將受到3中不同的光照射 環境光 ambient 散射光 diffuse 和鏡面光 specular 現實世界中,當然不存在這樣的光,但是,作為光抽象,這三種型別的光允許我們模擬和控制光照在物體表面上所產生的主要型別的效果。1 環境光 環境光並不是來...