`

【转】OpenGL入门学习——第四课

 
阅读更多

       

        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)
{
    glClear(GL_COLOR_BUFFER_BIT);
    glColor3f(0.0f, 1.0f, 1.0f);
    glRectf(-0.5f, -0.5f, 0.5f, 0.5f);
    glFlush();
}

 

注意: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 <windows.h>
#include <GL/gl.h>
#include <GL/glaux.h>

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

#include <math.h>
const GLdouble Pi = 3.1415926536;
void myDisplay(void)
{
    int i;
    for(i=0; i<8; ++i)
        auxSetOneColor(i, (float)(i&0x04), (float)(i&0x02), (float)(i&0x01));
    glShadeModel(GL_FLAT);
    glClear(GL_COLOR_BUFFER_BIT);
    glBegin(GL_TRIANGLE_FAN);
    glVertex2f(0.0f, 0.0f);
    for(i=0; i<=8; ++i)
    {
        glIndexi(i);
        glVertex2f(cos(i*Pi/4), sin(i*Pi/4));
    }
    glEnd();
    glFlush();
}

int main(void)
{
    auxInitDisplayMode(AUX_SINGLE|AUX_INDEX);
    auxInitPosition(0, 0, 400, 400);
    auxInitWindow(L"");
    myDisplay();
    Sleep(10 * 1000);
    return 0;
}

 

      其它部分大家都可以不管,只看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)
{
    glClearColor(1.0f, 0.0f, 0.0f, 0.0f);
    glClear(GL_COLOR_BUFFER_BIT);
    glFlush();
}

 
呵,这个还真简单~

 

 

 

4、指定着色模型
     OpenGL允许为同一多边形的不同顶点指定不同的颜色。例如:

 

#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();
}

 

       平滑效果图:



      单色效果图:

            

 


       在默认情况下,OpenGL会计算两点顶点之间的其它点,并为它们填上“合适”的颜色,使相邻的点的颜色值都比较接近。如果使用的是RGB模式,看起来就 具有渐变的效果。如果是使用颜色索引模式,则其相邻点的索引值是接近的,如果将颜色表中接近的项设置成接近的颜色,则看起来也是渐变的效果。但如果颜色表 中接近的项颜色却差距很大,则看起来可能是很奇怪的效果。
使用glShadeModel函数可以关闭这种计算,如果顶点的颜色不同,则将顶点之间的其它点全部设置为与某一个点相同。(直线以后指定的点的颜色为准,而多边形将以任意顶点的颜色为准,由实现决定。)为了避免这个不确定性,尽量在多边形中使用同一种颜色。
glShadeModel的使用方法:
glShadeModel(GL_SMOOTH);   // 平滑方式,这也是默认方式
glShadeModel(GL_FLAT);     // 单色方式

 

 

小结:
本课学习了如何设置颜色。其中RGB颜色方式是目前PC机上的常用方式。
可以设置glClear清除后屏幕所剩的颜色。
可以设置颜色填充方式:平滑方式或单色方式。

转自http://blog.csdn.net/andyhuabing/article/details/6957252

  • 大小: 16 KB
  • 大小: 28.7 KB
  • 大小: 16.6 KB
分享到:
评论

相关推荐

    OpenGL入门学习——写给想用计算机画图的朋友

    ### OpenGL入门学习——关键知识点详解 #### 一、OpenGL简介及优势 **OpenGL**(Open Graphics Library)是一种用于渲染2D、3D矢量图形的跨语言、跨平台的应用程序编程接口(API)。它被广泛应用于游戏开发、CAD/...

    OpenGL学习入门——VS2010环境配置.doc

    本文介绍了OpenGL学习入门——VS2010环境配置的过程,包括安装OpenGL库、安装GLUT工具包、配置VS2010环境、创建第一个OpenGL程序等内容。通过这些步骤,可以快速地开始使用OpenGL进行图形编程。

    OpenGL入门学习之十六——在Windows系统中显示文字.pdf

    ### OpenGL入门学习之十六——在Windows系统中显示文字 #### 一、引言 在进行图形编程时,尤其是在使用OpenGL这种强大的图形库时,我们往往需要处理不仅仅是图像本身,还包括文本信息的显示。然而,OpenGL并没有...

    OpenGL入门学习之十一——纹理的使用入门.pdf

    ### OpenGL入门学习之十一——纹理的使用入门 #### 一、纹理的概念与基本操作 **纹理**是OpenGL中一种非常重要的特性,它允许开发者在3D模型表面贴上图像,以此来增强场景的真实感和细节表现力。纹理的使用不仅...

    OpenGL入门学习之一——编写第一个OpenGL程序

    ### OpenGL入门学习知识点详解 #### 一、OpenGL简介与优势 **OpenGL** 是一种跨语言、跨平台的应用程序编程接口(API),用于渲染2D、3D矢量图形。它是图形学领域的一个重要标准,被广泛应用于游戏开发、虚拟现实...

    net游戏编程源入门经典——C#篇

    通过《.NET游戏编程源入门经典——C#篇》的学习,读者可以逐步掌握游戏开发的核心技术,从零开始构建自己的游戏。配合代码示例,理论与实践相结合,将使学习过程更加高效。无论是想独立开发小游戏,还是希望在游戏...

    Opengl入门教学.pdf

    ### OpenGL入门教学——掌握现代图形编程的关键 #### 引言:超越传统图形编程的限制 在探讨编程作图时,不少人的记忆或许还停留在Turbo C的`#include&lt;graphics.h&gt;`时代,那个以640*480分辨率、16色为极限的世界。...

    iPhone游戏开发入门经典——也适用于iPad

    《iPhone游戏开发入门经典——也适用于iPad》一书是由Peter Bakhirev、PJ Cabrera、Ian Marsh等多位在IT领域有着深厚经验的专家共同撰写的,旨在为初学者提供一套全面且实用的iPhone及iPad游戏开发指南。本书不仅...

    [.NET游戏编程入门经典—— C#篇]源文件

    通过阅读《.NET游戏编程入门经典——C#篇》的源文件,你可以逐步学习并实践这些知识点,从而开启你的游戏开发之旅。这些基础将为你打开通向更复杂游戏项目的大门,并为未来的进阶学习打下坚实基础。

    OpenGL ES从入门到精通

    4. "[eoeandroid特刊]第27期 OpenGL ES学习及项目解析":结合项目实例,解析OpenGL ES在实际开发中的应用。 通过上述资源的学习和实践,你可以逐步掌握OpenGL ES,实现复杂的图形效果和高性能的2D/3D应用程序。在...

    C# Nehe OpenGL第二课 绘制多边形

    在Nehe的这个第二课中,你将学习如何创建一个简单的OpenGL上下文,初始化必要的OpenGL状态,然后绘制一个多边形。首先,你需要设置视口、投影和模型视图矩阵。接着,定义多边形的顶点,然后调用`glBegin()`和`glEnd...

    Visual C++ - OpenGL Super Bible fourth edition

    ##### 第一部分:OpenGL入门 **第1章:什么是OpenGL?** - **OpenGL简介**:介绍了OpenGL的历史背景及其发展过程。 - **OpenGL的工作原理**:描述了OpenGL在Windows系统中的运行机制,以及软件与硬件图形架构的区别。...

    OpenGL_Nehe.pdf

    ### OpenGL与NeHe教程知识点概览 #### 一、教程简介 - **目的与受众**:该教程旨在为初学者提供一个轻松简单的学习路径,帮助他们...无论是想要入门OpenGL还是希望深入掌握特定技术点的学习者,都可以从该教程中获益。

    一周学会OpenGL.pdf

    描述中强调了该文档是OpenGL入门必读资料,暗示了文档内容的全面性和实用性。同时,文档使用了吸引人下载的言辞,传达了文档的价值和作者的自信。 标签“一周学会OpenGL”直接揭示了文档的核心功能——在一周内教授...

    Androids手机开发教程——从入门到精通详解

    - 第4层:应用程序框架层,开发者可以在此层之上构建自己的应用程序。 Android SDK的开发环境: Android SDK是开发Android应用程序的重要工具,它包括了API库、开发工具和调试工具等。开发环境的安装和配置是进行...

    NeHe OpenGL(delphi)

    此文档主要介绍NeHe OpenGL教程在Delphi环境下的第一部分——基本框架的实现。 #### 二、基础知识与概念 - **OpenGL**: 一种跨语言、跨平台的应用程序接口(API),用于渲染2D、3D矢量图形。它由一系列函数组成,...

    OpenGL Programming Guide

    #### 第四章至第八章:色彩、光照、混合、纹理映射等高级主题 这些章节详细介绍了OpenGL如何处理颜色和光照效果,包括环境光、漫反射和镜面反射。同时,还介绍了如何实现混合、抗锯齿、雾化和多边形偏移等高级渲染...

    Android 4游戏编程入门经典

    ##### 第4章:面向游戏开发者的Android - **Android框架介绍**:深入了解Android操作系统的核心架构。 - **游戏性能优化**:探讨提高游戏性能的方法和技术。 - **多媒体支持**:讲解如何在Android游戏中使用音频和...

    OpenGL ES 3.x游戏开发 上卷 吴亚峰

    第四章讨论了光照的基本原理及其在OpenGL ES 3.x中的实现方式。 - **光照类型**:分为环境光、漫反射光和镜面反射光三种基本类型。 - **光照模型**:Phong光照模型是最常见的实现方式之一,它综合了以上三种光照...

Global site tag (gtag.js) - Google Analytics