OpenGL(三) RGBA颜色设置

OpenGL支持两种颜色模式:一种是RGBA,一种是颜色索引模式。

像素点附加颜色信息之后,就必须为每一个像素点额外分配一个内存空间保存该点的颜色信息,对于RGBA颜色模式,保存的数据直接代表了颜色,对于颜色索引模式,保存的是该颜色在颜色索引表中的位置,通过查颜色索引表对应到相应的颜色上。

颜色索引模式的优点是占用空间小,运行速度快,缺点是显示效果稍差,随着硬件的提速升级,RGBA颜色模式成为主流。


RGBA颜色模式


RGBA模式中,RGBA分别表示红绿蓝三色的分量,A(Alpha)表示颜色的透明度,通过设置RGB不同的比例,可以获得任意的颜色。

OpenGL中颜色的设置可以通过函数glColor4f设置。glColor4f的传入参数是Glfolat类型的浮点型,可以精确到小数点后若干位,但是实际的显示效果由硬件决定。

相关代码:

void myDisplay(void)    
{ 
	//使用RGBA颜色模式设置背景色为红色的矩形框
	glClear(GL_COLOR_BUFFER_BIT);
	glColor4f(1,0,0,1);
	glRectf(-0.8,-0.8,0.5,0.5);
	glFinish();
}

效果:



A(Alpha)通道是图像的不透明度参数。如果一个像素的alpha通道数值为0,那它就是完全透明的(也就是看不见的),而数值为1则意味着一个完全不透明的像素(传统的数字图像)。在0-1之间的值 则使得像素可以透过背景显示出来,就像透过玻璃(半透明性)看背景一样。

设置透明效果需要先用glEnable(GL BLEND)打开混合色功能,glDisable(GL DEPTH TEST)关闭深度测试功能,才能实现透明色。

相关代码:

void myDisplay(void)    
{ 
	//使用RGBA颜色模式设置背景色为红色的矩形框
	glClear(GL_COLOR_BUFFER_BIT);	
	//设置alpha通道透明度
	glEnable(GL_BLEND);  //开启混合模式
	glDisable(GL_DEPTH_TEST);  //关闭深度测试
	glBlendFunc(GL_SRC_ALPHA,GL_ONE);
	glColor4f(0,1,0,1); 
	glRectf(-0.5,-0.5,0.8,0.8);
	glFinish();
}


Alpah为1时效果,完全不透明:                                      Alpha为0.5时效果,半透明:

     


设置清除屏幕所用的颜色


在作图之前一般使用glClear(GL COLOR BUFFER BIT)把屏幕上已经绘制的图形清理掉,相当于用一个黑板檫把所有窗口上的图形擦除掉,只剩下黑板的默认颜色——黑色。

这个黑板的颜色也可以指定的,可以理解为用一个指定的颜色去清除掉窗口上已有图形颜色,在RGB模式下使用glClearColor函数即可。


相关代码:

void myDisplay(void)    
{ 
	//设置清除屏幕所用的颜色
	glClearColor(0.5,0.8,0.3,0);
	glClear(GL_COLOR_BUFFER_BIT);
	glFlush();
}

效果:





设置着色模型


OpenGL允许为同一个多边形的不同顶点设置不同的颜色。默认情况下,程序会根据两个顶点之间的颜色的差距,在两个顶点之间的点上均匀分布颜色,显示出来的效果就是从一个颜色到另外一个颜色渐变。

显示效果:



可以使用函数glShadeMode 关闭这种渐变的效果,这时候相信顶点之间的距离是跟其中某一个顶点的颜色一样的,但是具体跟哪一保持一致要看具体实现,是不确定的,OpenGL 建议尽量在一个多边形中使用同一种颜色。

相关代码:

void myDisplay(void)    
{ 
	//设置着色模型
	glClear(GL_COLOR_BUFFER_BIT);
	int i;   
	float Pi=3.1415926f;
	// glShadeModel(GL_FLAT);    //取消颜色的渐变,改为单一颜色
	glClear(GL_COLOR_BUFFER_BIT);
	glBegin(GL_TRIANGLE_FAN);    
	glColor3f(1.0f, 1.0f, 1.0f);  //设置第一个点的颜色
	glVertex2f(0.0f, 0.0f);    
	for(i=0; i<=8; ++i)    
	{        
		glColor3f(i&0x04, i&0x02, i&0x01);   //设置各个顶点的颜色
		glVertex2f(cos(i*Pi/4), sin(i*Pi/4));  //8个顶点平均分布在一个圆上
	}    
	glEnd();   
	glFlush(); 
}

效果:




完整代码:

#include <glut.h> 
#include <iostream>

using namespace std;

void myDisplay(void)    
{ 
	//使用RGBA颜色模式设置背景色为红色的矩形框
	glClear(GL_COLOR_BUFFER_BIT);
	glColor4f(1,0,0,1);
	glRectf(-0.8,-0.8,0.5,0.5);
	glFinish();
	//设置alpha通道透明度
	glEnable(GL_BLEND);  //开启混合模式
	glDisable(GL_DEPTH_TEST);  //关闭深度测试
	glBlendFunc(GL_SRC_ALPHA,GL_ONE);
	glColor4f(0,1,0,1); 
	glRectf(-0.5,-0.5,0.8,0.8);
	glFinish();

	//设置清除屏幕所用的颜色
	/*glClearColor(0.5,0.8,0.3,0);
	glClear(GL_COLOR_BUFFER_BIT);
	glFlush();*/

	//设置着色模型
	int i;   
	float Pi=3.1415926f;
	//glShadeModel(GL_FLAT);    //取消颜色的渐变,改为单一颜色
	glClear(GL_COLOR_BUFFER_BIT);
	glBegin(GL_TRIANGLE_FAN);    
	glColor3f(1.0f, 1.0f, 1.0f);  //设置第一个点的颜色
	glVertex2f(0.0f, 0.0f);    
	for(i=0; i<=8; ++i)    
	{        
		glColor3f(i&0x04, i&0x02, i&0x01);   //设置各个顶点的颜色
		glVertex2f(cos(i*Pi/4), sin(i*Pi/4));  //8个顶点平均分布在一个圆上
	}    
	glEnd();   
	glFlush(); 
}  

int main(int argc, char *argv[])    
{    
	glutInit(&argc, argv);   //初始化GLUT
	glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);  
	glutInitWindowPosition(500, 200);    
	glutInitWindowSize(400, 400);    
	glutCreateWindow("OpenGL");   
	glutDisplayFunc(&myDisplay);   //回调函数 
	glutMainLoop();    //持续显示,当窗口改变会重新绘制图形
	return 0;    
}  


  • 6
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值