Graphics 版 (精华区)
发信人: killest (victor), 信区: Graphics
标 题: OPENGL基础篇(4)
发信站: 紫 丁 香 (Sat Feb 14 18:05:53 1998), 转信
发信人: yxy (田丝丝#冬眠的小肥鹰), 信区: Graphics
标 题: OPENGL基础篇(4)
发信站: BBS 水木清华站 (Mon Jan 19 17:15:49 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的阶梯,
大家快来呀 ......
--
m7m※ 来源:·BBS 水木清华站 bbs.net.tsinghua.edu.cn·[FROM: 166.111
--
oo
il bb yy il ..... 与尔同消万古愁 ....
i bbb ll yyy i
iii bb yy iii
oo
※ 来源:.紫 丁 香 pclinux.hit.edu.cn.[FROM: victor.hit.edu.c]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:3.697毫秒