OpenGL 入門教程 八

2021-08-22 03:57:47 字數 1971 閱讀 9337

本文源自: ?

opengl中使用rgba色彩體系,rgb為紅綠藍三原色,a為?值,該值代表色彩融合時所佔的比例。顏色是頂點的重要屬性之一,沒有色彩的世界是毫無生氣的。

使用glcolor*(r,g,b,a);設定當前顏色,此後定義所有的頂點都將是這個顏色的,直到再次改變當前顏色。該命令有兩種常用形式glcolor*f和glcolor*ub,後者可以直接使用getrvalue(pixel)取得的顏色分量作為引數。下面左邊的**就可以生成右邊漂亮的三角形:

可以看出,相鄰頂點之間的部份也會有顏色,實際上opengl會在頂點之間進行插值分割,最終計算出對應光柵每一點的顏色,這個計算結果就是最終顯示在螢幕上的影象。

也許上邊的**和文字暗示你給頂點指定的顏色就是螢幕影象上顯示的顏色,其實最終的顏色取決於多個因素:頂點材質、法線方向、光照條件。不同顏色的光從不同角度照射在頂點上,頂點的顏色也會發生變化。上面的圖是在白色光垂直照射條件下得到的(這也是預設設定)。

我們也可以不簡單的指定頂點顏色,而是詳細的說明該頂點產生的環境光、漫反射光、鏡面反射光的顏色。opengl使用一種簡易方法計算出面的影象:根據法向和光源位置的關係將以上幾種光的顏色結合燈光對應成份顏色分別指定平面的各部份。從乙個頂點產生的反射光不會再照射到其它頂點上,它對其它部份的影響直接在環境光中定義。要想取得更逼真的影象,可以使用光線追蹤演算法,該方法沿著每一條光線的軌跡,計算出它對所有頂點的影響,將所有光線的效果合併就是最終的影象,由於反射光的照明效果也是精確計算出來的,所以影象逼真。但是opengl並不直接支援該方法,需要自己編寫計算例程,感興趣的話去看看光線追蹤的書好了。

用glmaterial*指定當前材質,第乙個引數說明是給面的哪一側指定材質(前或者後,詳見法向部份說明),第二個引數指定要修改的分量,最後部份引數是相應的值。

glfloat ambient =;//環境光

glfloat diffuse =;//漫反射特性

glfloat specular =;//鏡面反射光色

glfloat shininess =; //鏡面反射的光亮度

glmaterialfv(gl_front,gl_ambient,ambient);

glmaterialfv(gl_front,gl_diffuse,diffuse);

glmaterialfv(gl_front,gl_specular,specular);

glmaterialfv(gl_front,gl_shininess,shininess);

glusphere(obj,0.1,10,10);//用10x10個面繪製半徑0.1的球面 

opengl還支援自動雙面模式,這種模式下定義的每個面都將生成兩個面,位置重合但法向相反,這可以簡化對背面和物體內部的描述。該模式預設為關閉。

開/關命令是:

void gllightmodel* gl_light_model_two_side,0/1);

開啟顏色材質可以簡化材質設定,在顏色材質開啟時,可以用glcolor直接給定頂點材質的顏色,設定材質的哪部分可用glcolormaterial(face,mode);命令設定。而不用象上面那樣寫一串羅嗦的**。但是由於不能對材質屬性做細節控制,只適用於一些特定的場合。命令是:glenable(gl_color_material);預設值為disabled。

OpenGL 入門教程 三

opengl 入門教程 三 本文源自 如果使用aux glut vcl則可免去這一步。如果在視窗系統中使用opengl則必須給視窗加上ws clipchildren和 ws clipsiblings兩個屬性,否則只能得到黑屏。注 只在mdi應用中需要這樣做。在bcb中可在任何視窗控制項的create...

c 入門教程 八

事前日常敲黑板 1 事情從今天開始變得複雜了 需要用心了哦 首先,思考下面情形 輸入乙個數字,輸出這個數到0之間的所有數字 不要掙扎了,流程圖逃不掉的 仔細觀察一下,看一下和前面的if 的流程圖有什麼區別.答案 if的判斷框的兩個分支都是向下的,這裡面的乙個分支是向上的,也就是說如果判斷的結果滿足某...

C 入門教程(八) if 語句

小古銀的官方 完整教程 鞏固練習 以下整個是一條if語句 if true或者false else if true或者false else if true或者false 這裡可以有一堆else if true或者false else 當上面都是false的時候 if語句從上向下一步步判斷,當遇到第乙個...