openGl从零开始之添加颜色

OpenGL 支持两种颜色模式:一种是 RGBA模式,一种是 颜色索引模式。

无论哪种颜色模式,计算机都必须为每一个像素保存一些数据,即通过每一个像素的颜色,来改变整体图形的颜色。不同的是, RGBA 模式中,数据直接就代表了颜色;而颜色索引模式中,数据代表的是一个索引,要得到真正的颜色,还必须去查索引表。具体如下:

1、RGBA模式

RGBA 模式中,每一个像素会保存以下数据: R 值(红色分量)、 G 值(绿色分量)、 B 值(蓝色分量)和A 值( alpha 分量)。

其中红、绿、蓝三种颜色相组合,就可以得到我们所需要的各种颜色,而 alpha 不直接影响颜色,它将留待以后介绍。

在 RGBA 模式下选择颜色是十分简单的事情,只需要一个函数就可以搞定。

void glColor3f(GLfloat red, GLfloat green, GLfloat blue);//三个参数的版本可以指定 R、 G、 B 的值,而 A 值采用默认
void glColor4f(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);//四个参数的版本可以分别指定 R、 G、 B、 A 的值

注意:浮点数可以精确到小数点后若干位,这并不表示计算机就可以显示如此多种颜色。实际上,计算机可以显示的颜色种数将由硬件决定。如果 OpenGL 找不到精确的颜色,会进行类似“四舍五入”的处理。

代码实例:

void display(void)
{
    //设定当前绘制的颜色模式为绿色
    glColor3f(0,1,0);
    //接下来在绿色模式下绘制正方形,采用线段连接方式
    glLineWidth(2);
    glBegin(GL_LINE_LOOP);
    {
        glVertex2f(-0.5,-0.5);
        glVertex2f(-0.5,0.5);
        glVertex2f(0.5,0.5);
        glVertex2f(0.5,-0.5);
    }
    glEnd();

    //更换当前绘制颜色模式为红色
    glColor3f(1,0,0);
    //接下来在红色模式下绘制正方形
    glLineWidth(2);
    glBegin(GL_LINE_LOOP);
    {
        glVertex2f(-0.2,-0.2);
        glVertex2f(-0.2,0.2);
        glVertex2f(0.2,0.2);
        glVertex2f(0.2,-0.2);
    }
    glEnd();

    glFlush();
}

效果图:

注意: glColor以及其他系列函数都有个准则,在参数类型不同时,表示“最大”颜色的值也不同。

采用 f和 d 做后缀的函数(如glColor3f(1,1,1)),以 1.0 表示最大的使用。

采用 b 做后缀的函数(如glColor3b(127,127,127)),以 127 表示最大的使用。

采用 ub 做后缀的函数(如glColor3ub(255,255,255)),以 255 表示最大的使用。

2、颜色索引模式

在索引颜色模式中, OpenGL 需要一个颜色表。这个表就相当于画家的调色板:虽然可以调出很多种颜色,但同时存在于调色板上的颜色种数将不会超过调色板的格数。

试将颜色表的每一项想象成调色板上的一个格子:它保存了一种颜色。索引颜色的主要优势是占用空间小(每个像素不必单独保存自己的颜色,只用很少的二进制位就可以代表其颜色在颜色表中的位置),花费系统资源少,图形运算速度快,但它编程稍稍显得不是那么方便,并且画面效果也会比 RGB 颜色差一些。

现在的PC机性能提高,大多都使用RGB模式。

3、清除屏幕用的颜色

glClear(GL_COLOR_BUFFER_BIT);意思是把屏幕上的颜色清空。但实际上什么才叫“空”呢?在宇宙中,黑色代表了“空”;在一张白纸上,白色代表了“空”;在信封上,信封的颜色才是“空”。

OpenGL 用下面的函数来定义清楚屏幕后屏幕所使用的颜色:

//这两行代码清理窗口的颜色为指定的颜色
glClearColor(1,0,0,1);//清理屏幕,并指定新的颜色为空颜色,默认是(0,0,0,0),即黑色,但此时还未使用
glClear(GL_COLOR_BUFFER_BIT); //清理缓存中的颜色,并采用glClearColor中指定的颜色作为缓存色,于是屏幕的颜色发生改变

4、设置着色模型

主要影响的是不同颜色间是如何过渡到一起的。

如一条线段的两个点A和B,A点设置为红色,B点设置为绿色,那么两点之间的点颜色的变化由着色模式来决定:

glShadeModel(GL_SMOOTH); // 平滑渐变方式,这也是默认方式
glShadeModel(GL_FLAT); // 单色方式,两点之间的颜色全部采用某一点的颜色

代码实例:

void display(void)
{
    glLineWidth(5);
    glShadeModel(GL_SMOOTH);//不设置时默认也是该模式:渐变模式
    glBegin(GL_LINES);
    {
        //设置A点的颜色为红色
        glColor3f(1,0,0);
        glVertex2f(0,0.5);
        //设置B点的颜色为绿色
        glColor3f(0,1,0);
        glVertex2f(0.5,0.5);
    }
    glEnd();

    glShadeModel(GL_FLAT);//单色模式
    glBegin(GL_LINES);
    {
        //设置A点的颜色为红色
        glColor3f(1,0,0);
        glVertex2f(0,0);
        //设置B点的颜色为绿色
        glColor3f(0,1,0);
        glVertex2f(0.5,0);
    }
    glEnd();

    glFlush();
}

效果实例:

颜色的只是基本就这些了。

最后再给一个的实例:

const int n = 10;
const GLfloat R = 0.5;
const GLfloat PI = 3.1415926536f;
void myDisplay(void)
{
    glBegin(GL_POLYGON);
    {
        glColor3f(1,1,1);
        glVertex2f(0,0);
        for (int i=1; i<8; i++)
        {
            glColor3f(i&0x004,i&0x002,i&0x001);
            glVertex2f(R*cos(i*PI/3),R*sin(i*PI/3));
        }
    }
    glEnd();

    glFlush();
}
时间: 2024-10-13 19:19:05

openGl从零开始之添加颜色的相关文章

第03课 OpenGL 添加颜色

添加颜色: 作为第二课的扩展,我将叫你如何使用颜色.你将理解两种着色模式,在下图中,三角形用的是光滑着色,四边形用的是平面着色 上一课中我教给您三角形和四边形的绘制方法.这一课我将教您给三角形和四边形添加2种不同类型的着色方法.使用Flat coloring(单调着色)给四边形涂上固定的一种颜色.使用Smooth coloring(平滑着色)将三角形的三个顶点的不同颜色混合在一起,创建漂亮的色彩混合. 继续在上节课的DrawGLScene例程上修改.下面将整个例程重写了一遍.如果您计划修改上节课

操作DOM元素,Dom元素添加颜色,删除第二个li元素

<html> <head> <title>demo</title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <script type="text/javascript"> /* 示例操作DOM元素 */ window.onload = function(){ //给Dom元素添

mfc中 控件 对话框 添加颜色 背景图片

1 设置对话框透明 在设置控件颜色中要使用 nCtlColor Contains one of the following values, specifying the type of control: CTLCOLOR_BTN   Button control CTLCOLOR_DLG   Dialog box CTLCOLOR_EDIT   Edit control CTLCOLOR_LISTBOX   List-box control CTLCOLOR_MSGBOX   Message b

canvas给图形添加颜色

canvas给图形添加颜色 合法属性 ctx.fillStyle = 'orange'; ctx.fillStyle = '#FFA500'; ctx.fillStyle = 'rgb(255, 165, 0)'; ctx.fillStyle = 'rgba(255, 165, 0, 1)'; strokeStyle类似 ctx.globalAlpha = 0.2; 设置全局透明度 给图形上色 const canvas = document.getElementById('canvas'); c

在脚本中添加颜色

shell脚本一直单调,但是在图形环境下运行,除了read和echo语句外,还有其他许多与脚本用户交互的方法.这一节深入介绍几种不同的方法. 1.创建文本菜单 创建交互式的shell文本,主要使用case语句 1.1.创建菜单布局 确定所要显示的内容: echo -e #-e指定了输出内容中必须要包含制表符和换行符. 例如:echo -e "1.\tDisplay disk space" 设置菜单: clear echo echo -e "\t\t\tSys Admin Me

多学一点(十五)——为man命令添加颜色提示

默认情况下,Linux中的man命令显示结果是不带颜色的,看起来交互性并不好.可以添加一些配置,为其添加一些颜色提示. 修改.bashrc文件: [[email protected] ~]# vim .bashrc 在文件最后加入如下配置: # Set colors for man pages man() {   env   LESS_TERMCAP_mb=$(printf "\e[1;31m")   LESS_TERMCAP_md=$(printf "\e[1;31m&qu

mac 终端添加颜色

1.打开终端,然后找到终端偏好设置,选择自己喜欢的颜色 2.然后切换到当前用户的家目录: cd ~ 3.打开文件,开始编辑".bash_profile", 添加下面两句 export LS_OPTIONS='--color=auto' # 如果没有指定,则自动选择颜色 export CLICOLOR='Yes' #是否输出颜色 export LSCOLORS='Exfxcxdxbxegedabagacad' #指定颜色 4.保存,然后关闭中断,重启一下就OK了.

添加颜色渐变

[self.layer addSublayer:[self shadowAsInverse]]; - (CAGradientLayer *)shadowAsInverse { CAGradientLayer *newShadow = [[[CAGradientLayer alloc] init] autorelease]; CGRect newShadowFrame =self.frame; newShadow.frame = newShadowFrame; //添加渐变的颜色组合 newSha

给 console 添加颜色

简评:使用 %c 声明可以给 console 的输出添加 CSS 样式,日志太多的话,给不同种类的日志设置不同的样式,可以极大的提升阅读体验. 什么是 %c %c: 标识将 CSS 样式应用于 %c 之后的 console 消息. 给 console 消息设置多个样式 可以给同一条 Console 消息设置多种颜色. console.log( 'Nothing here %cHi Cat %cHey Bear', // Console Message 'color: blue', 'color: