发信人: yxy (田丝丝#冬眠的小肥鹰), 信区: GAME_Designer 
标  题: OPENGL(5) 
发信站: BBS 水木清华站 (Fri Jan 16 09:13:13 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 水木清华站 bbs.net.tsinghua.edu.cn·[FROM: 166.111.74.90]