OpenGL颜色

	这回可能是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 <windows.h>
#include <gl/gl.h>
#include <gl/glu.h>
#include <gl/glaux.h>

#pragma comment(lib, "OpenGl32.lib")
#pragma comment(lib, "glu32.lib")
#pragma comment(lib, "glaux.lib")

#pragma warning(disable : 4244)		// MIPS
#pragma warning(disable : 4136)		// X86
#pragma warning(disable : 4051)		// ALPHA



//sample.cpp
//                               
#include <gl/gl.h>
#include <gl/glu.h>
#include <gl/glaux.h>

#pragma comment(lib, "OpenGl32.lib")
#pragma comment(lib, "glu32.lib")
#pragma comment(lib, "glaux.lib")

#pragma warning(disable : 4244)		// MIPS
#pragma warning(disable : 4136)		// X86
#pragma warning(disable : 4051)		// ALPHA

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 sample
下次将介绍OPENGL的光照和材质效果,一个步入3D的阶梯,大家快来呀 ......
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值