zoukankan      html  css  js  c++  java
  • 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;    
    }  


  • 相关阅读:
    vagrant 的安装与使用
    vagrant 的安装与使用
    rz、sz (上传下载)命令参数的解释
    rz、sz (上传下载)命令参数的解释
    TensorFlow 学习(十五)—— tensorflow.python.platform
    音乐的作曲形式
    vc中edit控件使用总结
    引用 LPSTR、LPCSTR、LPTSTR、LPCTSTR、LPWSTR及LPCWSTR的意义及区别
    编译原理三大经典书籍(龙书 虎书 鲸书)
    VS2003与Win7的兼容性问题
  • 原文地址:https://www.cnblogs.com/mtcnn/p/9411924.html
Copyright © 2011-2022 走看看