您的位置:首页 > 运维架构

第三个程序opengl颜色选择

2013-11-07 20:18 357 查看
仔细研究代码比较好,所以我就直接上代码吧。

// myfistopengl4.cpp : 定义控制台应用程序的入口点。
//
//目的:opengl的颜色选择

/*
尽量不要用glaux.
原因:
1 功能不完善,不适合于编程人员。
2 和平台有关,这有悖于openGL通用平台的初衷。
*/

#include "stdafx.h"

#include <windows.h>
#include <GL/gl.h>
#include <gl\glut.h>
#include "glaux.h"

#pragma comment (lib, "opengl32.lib")
#pragma comment (lib, "glaux.lib") //链接库glauxlib文件到工程中,和setting中加入lib文件的效果是一样的,可是我不明白为什么glut32.lib 不需要这样做呢??

#include <math.h>
const GLdouble Pi = 3.1415926536;

/*
glColor*系列函数可以用于设置颜色,其中三个参数的版本可以指定R、G、B的
void glColor3f(GLfloat red, GLfloat green, GLfloat blue);
void glColor4f(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);

采用f和d做后缀的函数,以1.0表示最大的使用。
采用b做后缀的函数,以127表示最大的使用。
采用ub做后缀的函数,以255表示最大的使用。
采用s做后缀的函数,以32767表示最大的使用。
采用us做后缀的函数,以65535表示最大的使用。
*/
// RGBA颜色测试
//在RGB模式下,使用glClearColor来指定“空”的颜色
void myDisplay_rectangle(void)
{
	glClearColor(1.0f, 0.0f, 0.0f, 0.0f); //清空后的颜色为红色
    glClear(GL_COLOR_BUFFER_BIT);
    glColor3f(0.0f, 0.0f, 1.0f);
    glRectf(-0.5f, -0.5f, 0.5f, 0.5f);
    glFlush();
}
/*
索引颜色的主要优势是占用空间小
(每个像素不必单独保存自己的颜色,
只用很少的二进制位就可以代表其颜色在颜色表中的位置),
花费系统资源少,图形运算速度快,但它编程稍稍显得不是那么方便,
并且画面效果也会比RGB颜色差一些。
目前的PC机性能已经足够在各种场合下使用RGB颜色,
因此PC程序开发中,使用索引颜色已经不是主流。
当然,一些小型设备例如GBA、手机等,
索引颜色还是有它的用武之地。
*/

//索引颜色测试
//在索引颜色模式下,使用glClearIndex来指定“空”的颜色所在的索引,它需要一个参数,其意义跟glIndexi相似。
void myDisplay_index(void)
{
    int i;
    for(i=0; i<8; ++i)
		//auxSetOneColor设置颜色表中的一格。循环八次就可以设置八格。
        auxSetOneColor(i, (float)(i&0x04), (float)(i&0x02), (float)(i&0x01));

    glShadeModel(GL_FLAT);
    glClear(GL_COLOR_BUFFER_BIT); //意思是把屏幕上的颜色清空。

    glBegin(GL_TRIANGLE_FAN);
    glVertex2f(0.0f, 0.0f); //在循环中用glVertex设置顶点
	
	//使用glIndex*系列函数可以在颜色表中选择颜色。其中最常用的可能是glIndexi
    for(i=0; i<=8; ++i)
    {
        glIndexi(i);       //用glIndexi改变顶点代表的颜色
        glVertex2f(cos(i*Pi/4), sin(i*Pi/4));
    }
    glEnd();
    glFlush();
}

//指定着色模式
/*
在默认情况下,OpenGL会计算两点顶点之间的其它点,
并为它们填上“合适”的颜色,使相邻的点的颜色值都比较接近。
如果使用的是RGB模式,看起来就具有渐变的效果。
如果是使用颜色索引模式,则其相邻点的索引值是接近的,
如果将颜色表中接近的项设置成接近的颜色,则看起来也是渐变的效果。
但如果颜色表中接近的项颜色却差距很大,则看起来可能是很奇怪的效果。
使用glShadeModel函数可以关闭这种计算,
如果顶点的颜色不同,则将顶点之间的其它点全部设置为与某一个点相同。
(直线以后指定的点的颜色为准,而多边形将以任意顶点的颜色为准,由实现决定。)
为了避免这个不确定性,尽量在多边形中使用同一种颜色。
*/
#include <math.h>
//const GLdouble Pi = 3.1415926536;
void myDisplay_colormodel(void)
{
    int i;
    glShadeModel(GL_FLAT);     // 单色方式
	//glShadeModel(GL_SMOOTH);   // 平滑方式,这也是默认方式
    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));
    }
    glEnd();
    glFlush();
}

/*int main(void)
{
    auxInitDisplayMode(AUX_SINGLE|AUX_INDEX);
    auxInitPosition(0, 0, 400, 400);
    auxInitWindow(L"");
    myDisplay_index();
	 //myDisplay_rectangle();
    Sleep(10 * 1000);
    return 0;
}*/

int main(int argc, char* argv[])
{
	
	glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
    glutInitWindowPosition(100, 100);
    glutInitWindowSize(400, 400);
    glutCreateWindow("OpenGL程序绘制图形");

	glutDisplayFunc(&myDisplay_colormodel);     
    glutMainLoop();	
	return 0;
}


测试着色模式时:

单色方式:



平滑方式:



矩形颜色设置:



索引颜色设置:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: