Graphics 版 (精华区)

发信人: dht (bbs), 信区: Graphics
标  题: : OPENGL(5)
发信站: 紫 丁 香 (Sun Oct  4 21:40:59 1998), 转信

这回可能是OPENGL最简单的内容:颜色。
一 RGB模式
一般来讲实现彩色是用RGB三基色来调配的。这就是
RGB模式,我们前面一直用这种方法
(例如:
         glColor3f(1.0,0.0,0.0);
         glVertex3f(0.0,0.0,0/0);
  绘制一个红色点。)
void glColor3{b s i f d ub us ui}(TYPE r,TYPE g, TYPE b);
void glColor4{b s i f d ub us ui}(TYPE r,TYPE g, TYPE b,TYPE a);
void glColor3{b s i f d ub us ui}v(TYPE *v);
void glColor4{b s i f d ub us ui}v(TYPE *v);
{}内是任选一种数值精度(看前面的介绍);
参数a是表征透明度的Alpha值。
后两个带v后缀的函数表明他们的参数是向量(详细使用看本篇的例子)。
以glColor3f为例,其参数取值范围-1.0--1.0,其它数值类型的函数将
自动把参数均匀影射到这个区间,例如:

后缀   类型       MIN    MIN映射      MAX       MAX映射
b      1byte整数  -128   -1.0         127       1.0

二 颜色索引模式
使用
void glIndex{s i f d}(TYPE c);
void glIndex{s i f d}(TYPE *c);
来从颜色索引表中选取颜色。设置当前颜色索引值(调色板号),大于
总数时取模。

前面所有例子都是RGB模式,所以这里给出一个颜色索引的例子:

//sample.cpp
//////////////////////////////
#include "glos.h"
#include <GL/gl.h>
#include <GL/glaux.h>
#include "windows.h"
void myinit(void);
void InitPalette(void);
void CALLBACK  display(void);
void CALLBACK  reshape(GLsizei w,GLsizei h);

void myinit(void)
{
    auxInitDisplayMode(AUX_SINGLE|AUX_INDEX);
        auxInitPosition(0,0,500,500);
        auxInitWindow("sample1");
        glClearColor(0.0,0.0,0.0,0.0);
        glClear(GL_COLOR_BUFFER_BIT);
        glShadeModel(GL_FLAT);//GL_FLAT填色模式
}

void CALLBACK reshape(GLsizei w,GLsizei h)
{
if(w<=500&&h<=500)
glViewport(0,0,w,h);
if(w>500&&h<=500)
glViewport(0,0,500,h);
if(w<=500&&h>500)
glViewport(0,0,w,500);
if(w>500&&h>500)
glViewport(0,0,500,500);

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
if(w<=h)
 glOrtho(-20.0,20.0,-20.0*(GLfloat)h/(GLfloat)w,
         20.0*(GLfloat)h/(GLfloat)w,-50.0,50.0);
else
  glOrtho(-20.0*(GLfloat)h/(GLfloat)w,
         20.0*(GLfloat)h/(GLfloat)w,-20.0,20.0,-50.0,50.0);

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}

void draw(void)
{
GLint n;

//首先给定三角扇的坐标信息
GLfloat pp[8][2]={{7.0,-7.0},{0.0,-10.0},{-7.0,-7.0},{-10.0,0.0},
{-7.0,7.0},{0.0,10.0},{7.0,7.0},{10.0,0.0}};

//先画前两个点,然后用循环读取前面的向量(数组)信息绘制
//完整图形
glBegin(GL_TRIANGLE_FAN);
 glVertex2f(0.0,0.0);
 glVertex2f(10.0,0.0);
 for(n=0;n<8;n++)
 {

//每次从颜色查找表中找出新颜色,然后以这个颜色绘制三角扇
//注意glVertex2fv()中v后缀的使用,以前没有碰到过,v后缀代表
//参数是个向量(数组)
 glIndexi(n+1);
 glVertex2fv(pp[n]);
 }
 glEnd();
}

void InitPalette(void)
{
//这是本例子的关键,初始化颜色查找表,这里一共定义
//乐8种颜色,是从蓝到青的渐进。
GLint i;
static GLfloat rgb[][3]={{0.0,0.0,0.2},{0.0,0.0,0.4},{0.0,0.0,0.6},
{0.0,0.0,1.0},{0.0,0.2,1.0},{0.0,0.4,1.0},{0.0,0.8,1.0},{0.0,1.0,1.0}};

//调用简单的辅助库函数设置系统调色板,把刚才8个颜色定为全部
//颜色索引的内容
for(i=0;i<8;i++)
auxSetOneColor(i+1,rgb[i][0],rgb[i][1],rgb[i][2]);
}

void CALLBACK display(void)
{
//首先调用自定义的InitPalette()初始化调色板
InitPalette();
glClearColor(0.0,0.0,0.0,1.0);
glClear(GL_COLOR_BUFFER_BIT);

glLoadIdentity();
draw();
glFlush();
}

void main(void)
{
    myinit();
    auxReshapeFunc(reshape);
    auxMainLoop(display);
}
//end of sample
下次将介绍OPENGL的光照和材质效果,一个步入3D的阶梯,
大家快来呀 ......

--
※ 来源:.紫 丁 香 bbs.hit.edu.cn.[FROM: cadcam.hit.edu.c]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:4.649毫秒