OpenGL学习——入门篇 第二章 基础实例2-3 RGBA颜色和索引色

来源:互联网 发布:aws centos 编辑:程序博客网 时间:2024/06/02 06:15

1. RGBA颜色的使用

以下参考自:http://www.cnblogs.com/crazyxiaom/articles/2073586.html 中OpenGL入门学习[四]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找不到精确的颜色,会进行类似“四舍五入”的处理。下面的代码是使用auxInitDisplayMode(AUX_SINGLE | AUX_RGBA);然后分别设置不同的颜色(红绿蓝)进行作图。
void myDisplay(void){    glClear(GL_COLOR_BUFFER_BIT);    //glColor3f(1.0f, 0.0f, 0.0f);//红    //glColor3f(0.0f, 1.0f, 0.0f);//绿    glColor3f(0.0f, 0.0f, 1.0f);//蓝    glRectf(-0.5f, -0.5f, 0.5f, 0.5f);    glFlush();}int main(void){    //auxInitDisplayMode(AUX_SINGLE | AUX_INDEX);    auxInitDisplayMode(AUX_SINGLE | AUX_RGBA);    auxInitPosition(0, 0, 400, 400);    auxInitWindow(L"");    myDisplay();    Sleep(10 * 1000);    return 0;}

AUX_RGBA

2. 体验索引颜色

索引颜色的主要优势是占用空间小(每个像素不必单独保存自己的颜色,只用很少的二进制位就可以代表其颜色在颜色表中的位置),花费系统资源少,图形运算速度快,但它编程稍稍显得不是那么方便,并且画面效果也会比RGB颜色差一些。“星际争霸”可能代表了256色的颜色表的画面效果,虽然它在一台很烂的PC上也可以运行很流畅,但以目前的眼光来看,其画面效果就显得不足了。目前的PC机性能已经足够在各种场合下使用RGB颜色,因此PC程序开发中,使用索引颜色已经不是主流。当然,一些小型设备例如GBA、手机等,索引颜色还是有它的用武之地。
#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);    auxInitDisplayMode(AUX_SINGLE | AUX_RGBA);    auxInitPosition(0, 0, 400, 400);    auxInitWindow(L"");    myDisplay();    Sleep(10 * 1000);    return 0;}

glIndex

简要说明:

1. void glShadeModel ( GLenum mode)

void glShadeModel ( GLenum mode)是OpenGL1.0提供的接口。作用是设置着色模式。
参数mode可以是GL_SMOOTH(默认值)或GL_FLAT。采用恒定着色时(即GL_FLAT),使用图元中某个顶点的颜色来渲染整个图元。
在使用光滑着色时(即GL_SMOOTH),独立的处理图元中各个顶点的颜色。对于线段图元,线段上各点的颜色将根据两个顶点的颜色通过差值得到。对于多边形图元,多边形内部区域的颜色将根据所有顶点的颜色差值得到。
如果本例中,将改为GL_SMOOTH,则输出如下图:
GL_SMOOTH

2.auxInitWindow

aux类接口并非我们的学习重点,因此,此处仅仅用于理解Index color使用,后面学习过程中如果有用再去仔细研究。

原创粉丝点击