OpenGL入門學習(四)

2021-05-04 09:28:45 字數 3873 閱讀 6943

opengl支援兩種顏色模式:一種是rgba,一種是顏色索引模式。

無論哪種顏色模式,計算機都必須為每乙個畫素儲存一些資料。不同的是,rgba模式中,資料直接就代表了顏色;而顏色索引模式中,資料代表的是乙個索引,要得到真正的顏色,還必須去查索引表。

1. rgba顏色

rgba模式中,每乙個畫素會儲存以下資料:r值(紅色分量)、g值(綠色分量)、b值(藍色分量)和a值(alpha分量)。其中紅、綠、藍三種顏色相組合,就可以得到我們所需要的各種顏色,而alpha不直接影響顏色,它將留待以後介紹。

在rgba模式下選擇顏色是十分簡單的事情,只需要乙個函式就可以搞定。

glcolor*系列函式可以用於設定顏色,其中三個引數的版本可以指定r、g、b的值,而a值採用預設;四個引數的版本可以分別指定r、g、b、a的值。例如:

void glcolor3f(glfloat red, glfloat green, glfloat blue);

void glcolor4f(glfloat red, glfloat green, glfloat blue, glfloat alpha);

(還記得嗎?3f表示有三個浮點引數~請看第二課中關於glvertex*函式的敘述。)

將浮點數作為引數,其中0.0表示不使用該種顏色,而1.0表示將該種顏色用到最多。例如:

glcolor3f(1.0f, 0.0f, 0.0f);   表示不使用綠、藍色,而將紅色使用最多,於是得到最純淨的紅色。

glcolor3f(0.0f, 1.0f, 1.0f);   表示使用綠、藍色到最多,而不使用紅色。混合的效果就是淺藍色。

glcolor3f(0.5f, 0.5f, 0.5f);   表示各種顏色使用一半,效果為灰色。

注意:浮點數可以精確到小數點後若干位,這並不表示計算機就可以顯示如此多種顏色。實際上,計算機可以顯示的顏色種數將由硬體決定。如果opengl找不到精確的顏色,會進行類似「四捨五入」的處理。

大家可以通過改變下面**中glcolor3f的引數值,繪製不同顏色的矩形。

void mydisplay(void)

注意:glcolor系列函式,在引數型別不同時,表示「最大」顏色的值也不同。

採用f和d做字尾的函式,以1.0表示最大的使用。

採用b做字尾的函式,以127表示最大的使用。

採用ub做字尾的函式,以255表示最大的使用。

採用s做字尾的函式,以32767表示最大的使用。

採用us做字尾的函式,以65535表示最大的使用。

這些規則看似麻煩,但熟悉後實際使用中不會有什麼障礙。

2、索引顏色

在索引顏色模式中,opengl需要乙個顏色表。這個表就相當於畫家的調色盤:雖然可以調出很多種顏色,但同時存在於調色盤上的顏色種數將不會超過調色盤的格數。試將顏色表的每一項想象成調色盤上的乙個格仔:它儲存了一種顏色。

在使用索引顏色模式畫圖時,我說「我把第i種顏色設定為某某」,其實就相當於將調色盤的第i格調為某某顏色。「我需要第k種顏色來畫圖」,那麼就用畫筆去蘸一下第k格調色盤。

顏色表的大小是很有限的,一般在256~4096之間,且總是2的整數次冪。在使用索引顏色方式進行繪圖時,總是先設定顏色表,然後選擇顏色。

2.1、選擇顏色

使用glindex*系列函式可以在顏色表中選擇顏色。其中最常用的可能是glindexi,它的引數是乙個整形。

void glindexi(glint c);

是的,這的確很簡單。

2.2、設定顏色表

opengl 並直接沒有提供設定顏色表的方法,因此設定顏色表需要使用作業系統的支援。我們所用的windows和其他大多數圖形作業系統都具有這個功能,但所使用的函式卻不相同。正如我沒有講述如何自己寫**在windows下建立乙個視窗,這裡我也不會講述如何在windows下設定顏色表。

glut工具包提供了設定顏色表的函式glutsetcolor,但我測試始終有問題。現在為了讓大家體驗一下索引顏色,我向大家介紹另乙個opengl工具包: aux。這個工具包是visualstudio自帶的,不必另外安裝,但它已經過時,這裡僅僅是體驗一下,大家不必深入。

#include 

#include 

#include 

#pragma comment (lib, "opengl32.lib")

#pragma comment (lib, "glaux.lib")

#include 

const gldouble pi = 3.1415926536;

void mydisplay(void)

glend();

glflush();

}int main(void)

其它部分大家都可以不管,只看mydisplay函式就可以了。首先,使用auxsetonecolor設定顏色表中的一格。迴圈八次就可以設定八格。

glshademodel等下再講,這裡不提。

然後在迴圈中用glvertex設定頂點,同時用glindexi改變頂點代表的顏色。

最終得到的效果是八個相同形狀、不同顏色的三角形。

索引顏色雖然講得多了點。索引顏色的主要優勢是占用空間小(每個畫素不必單獨儲存自己的顏色,只用很少的二進位制位就可以代表其顏色在顏色表中的位置),花費系統資源少,圖形運算速度快,但它程式設計稍稍顯得不是那麼方便,並且畫面效果也會比rgb顏色差一些。「星際爭霸」可能代表了256色的顏色表的畫面效果,雖然它在一台很爛的pc上也可以執行很流暢,但以目前的眼光來看,其畫面效果就顯得不足了。

目前的pc機效能已經足夠在各種場合下使用rgb顏色,因此pc程式開發中,使用索引顏色已經不是主流。當然,一些小型裝置例如gba、手機等,索引顏色還是有它的用武之地。

3、指定清除螢幕用的顏色

我們寫:glclear(gl_color_buffer_bit);意思是把螢幕上的顏色清空。

但實際上什麼才叫「空」呢?在宇宙中,黑色代表了「空」;在一張白紙上,白色代表了「空」;在信封上,信封的顏色才是「空」。

opengl用下面的函式來定義清楚螢幕後螢幕所擁有的顏色。

在rgb模式下,使用glclearcolor來指定「空」的顏色,它需要四個引數,其引數的意義跟glcolor4f相似。

在索引顏色模式下,使用glclearindex來指定「空」的顏色所在的索引,它需要乙個引數,其意義跟glindexi相似。

void mydisplay(void)

呵,這個還真簡單~

4、指定著色模型

opengl允許為同一多邊形的不同頂點指定不同的顏色。例如:

#include 

const gldouble pi = 3.1415926536;

void mydisplay(void)

glend();

glflush();

}在預設情況下,opengl會計算兩點頂點之間的其它點,並為它們填上「合適」的顏色,使相鄰的點的顏色值都比較接近。如果使用的是rgb模式,看起來就具有漸變的效果。如果是使用顏色索引模式,則其相鄰點的索引值是接近的,如果將顏色表中接近的項設定成接近的顏色,則看起來也是漸變的效果。但如果顏色表中接近的項顏色卻差距很大,則看起來可能是很奇怪的效果。

使用glshademodel函式可以關閉這種計算,如果頂點的顏色不同,則將頂點之間的其它點全部設定為與某乙個點相同。(直線以後指定的點的顏色為準,而多邊形將以任意頂點的顏色為準,由實現決定。)為了避免這個不確定性,盡量在多邊形中使用同一種顏色。

glshademodel的使用方法:

glshademodel(gl_smooth);   // 平滑方式,這也是預設方式

glshademodel(gl_flat);     // 單色方式

小結:本課學習了如何設定顏色。其中rgb顏色方式是目前pc機上的常用方式。

可以設定glclear清除後螢幕所剩的顏色。

可以設定顏色填充方式:平滑方式或單色方式。

本文源自:http://blog.chinaunix.net/u/26313/showart_218522.html

OpenGL入門學習 四

本次學習的是顏色的選擇。終於要走出黑白的世界了 opengl支援兩種顏色模式 一種是rgba,一種是顏色索引模式。無論哪種顏色模式,計算機都必須為每乙個畫素儲存一些資料。不同的是,rgba模式中,資料直接就代表了顏色 而顏色索引模式中,資料代表的是乙個索引,要得到真正的顏色,還必須去查索引表。1.r...

OpenGL入門筆記(四)

前面一直在畫二維圖形,其實三維圖形的繪製就是以其為基礎,可以說二維不過是三維的一種特例 相當與z 0 比如說要畫乙個正方體,它有上下左右前後共六個面組成,也就是要畫出六個正方形就可以了,只是要注意繪製時應該按逆時針繪製 好像是進行紋理對映時需要的。我們必須將opengl螢幕想象成一張很大的畫紙,後面...

OpenGL入門學習

include 太陽 地球和月亮 假設每個月都是30天 一年12個月,共是360天 static int day 200 day的變化 從0到359 void mydisplay void void myidle void int main int argc,char argv 3 關於垂直同步co...