OpenGL支援兩種顏色模式:一種是RGBA,一種是色彩索引模式。
無論哪種顏色模式,電腦都必須為每一個像素儲存一些資料。不同的是,RGBA模式中,資料直接就代表了顏色;而色彩索引模式中,資料代表的是一個索引,要得到真正的顏色,還必須去查索引表。
ex:
void myDisplay(void){glClear(GL_COLOR_BUFFER_BIT);glColor3f(0.5f, 0.5f, 0.5f);glRectf(-0.5f, -0.5f, 0.5f, 0.5f);glFlush();}
glColor3f裡面的3個參數分別用來設定RGB三個分量的值,A採用預設值。上面的R=G=B=0.5f表示 各個分量的值相等,所以顯示為灰色:
glClear(GL_COLOR_BUFFER_BIT);意思是把螢幕上的顏色清空。
glClearColor來指定“空”的顏色。比如,上述程式中,如果在glClear(GL_COLOR_BUFFER_BIT);
前面加上一句:
glClearColor(1.0f, 0.0f, 0.0f, 0.0f);
那麼”空“就是紅色了。那麼,運行後,可以得到如下結果:
OpenGL允許為同一多邊形的不同頂點指定不同的顏色。例如
#include <GL/glut.h>#include <math.h>const GLdouble Pi = 3.1415926536;void myDisplay(void){int i;// glShadeModel(GL_FLAT);glClear(GL_COLOR_BUFFER_BIT);glBegin(GL_TRIANGLE_FAN);glColor3f(1.0f, 1.0f, 1.0f);glVertex2f(0.0f, 0.0f);for(i=0; i<=8; ++i){glColor3f(i&0x04, i&0x02, i&0x01);glVertex2f(cos(i*Pi/4), sin(i*Pi/4));}glEnd();glFlush();}int main(int argc, char *argv[]){glutInit(&argc, argv);//對GLUT進行初始化,這個函數必須在其它的GLUT使用之前調用一次glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE); //設定顯示方式glutInitWindowPosition(100, 100); //設定視窗位置glutInitWindowSize(400, 400);//視窗大小glutCreateWindow("我的OpenGL程式"); //根據前面設定的資訊建立視窗。參數將被作為視窗的標題。glutDisplayFunc(&myDisplay); //當需要畫圖時,請調用myDisplay函數glutMainLoop(); //進行一個訊息迴圈return 0;}
結果如下:
在預設情況下,OpenGL會計算兩點頂點之間的其它點,並為它們填上“合適”的顏色,使相鄰的點的顏色值都比較接近。如果使用的是RGB模式,看起來就具有漸層的效果。如果是使用色彩索引模式,則其相鄰點的索引值是接近的,如果將顏色表中接近的項設定成接近的顏色,則看起來也是漸層的效果。但如果顏色表中接近的項顏色卻差距很大,則看起來可能是很奇怪的效果。
使用glShadeModel函數可以關閉這種計算,如果頂點的顏色不同,則將頂點之間的其它點全部設定為與某一個點相同。(直線以後指定的點的顏色為準,而多邊形將以任意頂點的顏色為準,由實現決定。)為了避免這個不確定性,盡量在多邊形中使用同一種顏色。
glShadeModel的使用方法:
glShadeModel(GL_SMOOTH); // 平滑方式,這也是預設
glShadeModel(GL_FLAT); // 單色方式
採用單色方式結果如下:
=======================================================================================================