3.颜色

来源:互联网 发布:忽必烈陵墓知乎 编辑:程序博客网 时间:2024/04/30 21:34

一、RGBA模式和颜色索引模式
OpenGL支持两种颜色模式:一种是RGBA,一种是颜色索引模式。无论哪种颜色模式,计算机都必须为每一个像素保存一些数据。

1.RGBA模式
RGBA模式中,数据直接就代表了颜色

2.颜色索引模式
颜色索引模式中,数据代表的是一个索引,要得到真正的颜色,还必须去查索引表

理解:
在索引颜色模式中,OpenGL需要一个颜色表。这个表就相当于画家的调色板:虽然可以调出很多种颜色,但同时存在于调色板上的颜色种数将不会超过调色板的格数。试将颜色表的每一项想象成调色板上的一个格子:它保存了一种颜色。在使用索引颜色模式画图时,我说“我把第i种颜色设置为某某”,其实就相当于将调色板的第i格调为某某颜色。“我需要第k种颜色来画图”,那么就用画笔去蘸一下第k格调色板。

下面只讨论RGBA模式

二、设置当前色
void glColor3f(GLfloat red, GLfloat green, GLfloat blue);
void glColor4f(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);

R值(红色分量)、G值(绿色分量)、B值(蓝色分量)和A值(alpha分量)

glColor系列函数,采用f和d做后缀的函数,各个颜色分量范围为0.0到1.0

设置当前色之后绘制的所有东东都是当前色的。即如果需要颜色改变,则在绘制前需重新设置当前色。

示例1:

glPushMatrix();     glTranslatef(0.0f,1.0f,-6.0f);    glBegin(GL_TRIANGLES);        //在每个顶点设置一次颜色        glColor3f(1.0f,0.0f,0.0f);        glVertex3f(-1.0f,0.0f,0.0f);        glColor3f(0.0f,1.0f,0.0f);        glVertex3f(-3.0f,-2.0f,0.0f);        glColor3f(0.0f,0.0f,1.0f);        glVertex3f(-1.0f,-2.0f,0.0f);    glEnd();glPopMatrix();glPushMatrix();     glTranslatef(2.0f,0.0f,-6.0f);    glBegin(GL_QUADS);        //只设置一次颜色,之后所有顶点都是这个颜色        glColor3f(1.0f,0.5f,0.2f);        glVertex3f(-1.0f,-1.0f,0.0f);        glVertex3f(-1.0f,1.0f,0.0f);        glVertex3f(1.0f,1.0f,0.0f);        glVertex3f(1.0f,-1.0f,0.0f);    glEnd();glPopMatrix();

效果图:
这里写图片描述

三、指定清除屏幕用的颜色
glClearColor(1.0f, 0.0f, 0.0f, 0.0f); //定义清楚屏幕后屏幕所拥有的颜色
glClear(GL_COLOR_BUFFER_BIT); //把屏幕上的颜色清空,清空后屏幕变为之前指定的颜色

例如,调用glClearColor(0.0f, 0.0f, 0.0f, 0.0f); 把清屏后屏幕的颜色定义为白色,之后调用glClear(GL_COLOR_BUFFER_BIT);屏幕的颜色就是白色。

四、指定着色模型
glShadeModel(GL_SMOOTH); // 平滑方式,这也是默认方式
glShadeModel(GL_FLAT); // 单色方式

使用光滑着色时(即GL_SMOOTH)(默认方式),独立的处理图元中各个顶点的颜色。对于线段图元,线段上各点的颜色将根据两个顶点的颜色通过插值得到。对于多边形图元,多边形内部区域的颜色将根据所有顶点的颜色插值得到。
如果使用的是RGB模式,看起来就具有渐变的效果。
如果是使用颜色索引模式,则其相邻点的索引值是接近的,如果将颜色表中接近的项设置成接近的颜色,则看起来也是渐变的效果。但如果颜色表中接近的项颜色却差距很大,则看起来可能是很奇怪的效果。

采用恒定着色时(即GL_FLAT),使用图元中某个顶点的颜色来渲染整个图元。(直线以 后指定的点的颜色为准,而多边形将以任意顶点的颜色为准,由实现决定。为了避免这个不确定性,尽量在多边形中使用同一种颜色。)

示例2:

    //平滑模式    glShadeModel(GL_SMOOTH);    glPushMatrix();         glTranslatef(-1.0f,-0.5f,-5.0f);        glBegin(GL_TRIANGLES);            glColor3f(1.0f,0.0f,0.0f);            glVertex3f(0.0f,0.0f,0.0f);            glColor3f(0.0f,0.0f,1.0f);            glVertex3f(0.0f,1.0f,0.0f);            glColor3f(0.0f,1.0f,0.0f);            glVertex3f(-1.0f,0.0f,0.0f);        glEnd();    glPopMatrix();    //单色模式    glShadeModel(GL_FLAT);    glPushMatrix();         glTranslatef(2.0f,-0.5f,-5.0f);        glBegin(GL_TRIANGLES);            glColor3f(1.0f,0.0f,0.0f);            glVertex3f(0.0f,0.0f,0.0f);            glColor3f(0.0f,0.0f,1.0f);            glVertex3f(0.0f,1.0f,0.0f);            glColor3f(0.0f,1.0f,0.0f);            glVertex3f(-1.0f,0.0f,0.0f);        glEnd();    glPopMatrix();

效果图:
这里写图片描述

采用了平滑模式,每个顶点设置为不同的颜色,看起来颜色从每个角喷出,并刚好在三角形的中心混合,三种颜色相互混合。
采用了单色模式后,即使每个顶点设置为不同的颜色,整个三角形也只使用其中一个顶点的颜色来渲染整个图元。

0 0
原创粉丝点击