OpenGL学习3
来源:互联网 发布:怎样做淘宝店铺装修 编辑:程序博客网 时间:2024/06/06 18:39
//显示三角形
//三角形顶点颜色不同
#include <stdlib.h>
#include <GL/glut.h>
void background(void)
{
//四个参数分别是红、绿、蓝和alpha值。
//这些值定义了窗口的颜色。这些值的范围在[0,1]之间。
glClearColor(0.0,0.0,0.0,0.0);//设置背景颜色为黑色
}
void myDisplay(void)//彩色的三角形
{
glClear(GL_COLOR_BUFFER_BIT);//buffer设置为颜色可写
//这两个函数限制了一组或多组图元的顶点定义。
//在这两个函数中间就是你所绘制的由多个顶点组成的图元。
//函数的参数表明了所绘制的图元的类型。本例中的GL_TRIANGLES 表明所绘制的图形为三角形。
glBegin(GL_TRIANGLES);//开始画三角形
//GL_SMOOTH为缺省值,为光滑渐变模式,GL_FLAT为平坦渐变模式。
glShadeModel(GL_SMOOTH);//设置为光滑明暗模式
//3表明有三个参数,分别为红、绿、蓝,4则多一个参数alpha。
//紧跟数字后面的字母表示数据类型。本例中的glColor3f表示三个参数,数据类型为GLfloat。
glColor3f(1.0,0.0,0.0);//设置第一个顶点为红色
//窗口的中心为原心,坐标为(0,0,0)。
//横坐标向左为负,向右为正;纵坐标向上为正,向下为负;
//z坐标向屏幕里为负,屏幕外为正,坐标系符合右手定则。
glVertex2f(-1.0,-1.0);//设置第一个顶点的坐标为(-1.0,-1.0)
glColor3f(0.0,1.0,0.0);//设置第二个顶点为绿色
glVertex2f(0.0,-1.0);//设置第二个顶点的坐标为(0.0,-1.0)
glColor3f(0.0,0.0,1.0);//设置第三个顶点为蓝色
glVertex2f(-0.5,1.0);//设置第三个顶点的坐标为(-0.5,1.0)
glEnd();//三角形结束
//glFlush清空所有buffer,使所有发出的命令能在规定的时间内运行。
//一定不能忘记这一条语句。只有加了这一句,前面的命令才能执行
glFlush();//强制OpenGL函数在有限时间内运行
}
void myReshape(GLsizei w,GLsizei h)//改变窗口的大小
{
//glViewport(Glint x,Glint y,GLsizei width,GLsizei height)设置视口。
//视口是一个矩形,x,y为视口左下角的坐标,以像素为单位,缺省值为(0,0)。
//width和height分别为视口的宽和高。
//OpenGl context第一次贴到窗口上时width和height分别设置成窗口的大小
glViewport(0,0,w,h);//设置视口
//指明哪一个矩阵为当前矩阵。
//本例中GL_PROJECTION指明投影矩阵堆栈为随后的矩阵操作的目标。
glMatrixMode(GL_PROJECTION);//指明当前矩阵为GL_PROJECTION
glLoadIdentity();//将当前矩阵置换为单位阵
if(w <= h)
//定义二维正视投影矩阵。left,right分别设置左右垂直切平面的坐标,
//bottom,top分别设置上下垂直切平面的坐标。
gluOrtho2D(-1.0,1.5,-1.5,1.5*(GLfloat)h/(GLfloat)w);//定义二维正视投影矩阵
else
gluOrtho2D(-1.0,1.5*(GLfloat)w/(GLfloat)h,-1.5,1.5);
glMatrixMode(GL_MODELVIEW);//指明当前矩阵为GL_MODELVIEW
}
int main(int argc,char ** argv)
{
/*初始化*/
glutInit(&argc,argv);//初始化GLUT库并同窗口系统对话协商
//glutInitDisplayMode用来确定所创建窗口的显示模式。
//本例中的参数GLUT_SINGLE 指定单缓存窗口,这也是缺省模式,
//对应的模式为GLUT_DOUBLE 双缓存窗口。
//参数GLUT_RGB指定颜色RGBA模式,这也是缺省模式,对应的模式为GLUT_INDEX 颜色索引模式窗口。
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
//初始化窗口的大小,第一个参数为窗口的宽度,第二个参数为窗口的高度,以像素为单位。
glutInitWindowSize(400,400);
//设置初始窗口的位置,第一个参数为窗口左上角x的坐标,
//第二个参数为窗口左上角y的坐标,以像素为单位。
//屏幕的左上角的坐标为(0,0),横坐标向右逐渐增加,纵坐标向下逐渐增加
glutInitWindowPosition(200,200);
/*创建窗口*/
glutCreateWindow("Triangle");//创建顶层窗口,窗口的名字为扩号中的参数
/*绘制与显示*/
background();
//注册当前窗口的形状变化回调函数。
//当改变窗口大小时,该窗口的形状改变回调函数将被调用。
//在此例中就是myReshape指定形状变化函数。
glutReshapeFunc(myReshape);
//注册当前窗口的显示回调函数。
//当一个窗口的图像层需要重新绘制时,
//GLUT将调用该窗口的的显示回调函数。
//在此例中的mydisplay就是显示回调函数,显示回调函数不带任何参数,
//它负责整个图像层的绘制。我们的大部分工作将集中在这个函数中。
glutDisplayFunc(myDisplay);
//进入GLUT事件处理循环。
//glutMainLoop函数在GLUT程序中最多只能调用一次,它一旦被调用就不再返回,
//并且调用注册过的回调函数。所以这个函数必须放在注册回调函数的后面,
//此例中为glutReshapeFunc, glutDisplayFunc。
glutMainLoop();
return(0);
}
如果对于需要重复操作的组合图形,可以采用利用显示列表,我们们可以减少重复的劳动,有详细的注释,大家看看就明白,这里使用glut库,如果出现连接错误,一般是因为 :1.settings->link没有设置,具体设置搜索百度;2.是您的glut库没有,或者版本不支持,可以下几个试验一下,记得要RbuiltAll,否则还是报错。下列代码使用了显示列表。
#include <windows.h>
#include <GL/glut.h>
GLuint listName = 1;
void myInit(void)
{
glClearColor(0.0,0.0,0.0,0.0);//设置背景为黑色
//GL_COMPILE表示仅仅编译。GL_COMPILE_AND_EXECUTE表示当命令被编译到显示列表时执行。
//显示列表时一个预先存储起来已被将来执行的一组OpenGL命令,
//使用glNewList函数创建显示列表,
//并将所有需要执行的命令按照命令发出的顺序放置在显示列表中,
//直到调用glEndList函数时结束显示列表。本例中所需要执行的命令为画一个多边形。
glNewList(listName,GL_COMPILE);//创建显示列表
//这两个函数限制了一组或多组图元的顶点定义。
//在这两个函数中间就是你所绘制的由多个顶点组成的图元。
//函数的参数表明了所绘制的图元的类型。
glBegin(GL_TRIANGLES);
//绘制三角形
glColor3f(1.0,0.0,0.0);
glVertex2f(1.0,1.0);
glColor3f(0.0,1.0,0.0);
glVertex2f(2.0,2.0);
glColor3f(0.0,0.0,1.0);
glVertex2f(1.5,2.5);
glTranslatef(0.5,-0.5,0.0);//坐标转换
glEnd();
glEndList();//结束显示列表
glShadeModel(GL_SMOOTH);
}
void myDisplay(void)
{
GLuint i;
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);//buffer设置为颜色可写
//执行一个显示列表。参数list为所要执行的显示列表的名字,类型为整形。
for(i=0;i<6;i++)
glCallList(listName);
glFlush();//强制OpenGL函数在有限时间内运行
}
void myReshape(GLsizei w,GLsizei h)
{
glViewport(0,0,w,h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
if(w<=h)
glOrtho(-4.0,4.0,-4.0*(GLfloat)h/(GLfloat)w,4.0*(GLfloat)h/(GLfloat)w,-8.0,8.0);
else
glOrtho(-4.0,4.0*(GLfloat)w/(GLfloat)h,-4.0,4.0,-8.0,8.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef(-4.0,0.0,-3.0);
}
int main(int argc,char ** argv)
{
/*初始化*/
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB|GLUT_DEPTH);
glutInitWindowSize(500,500);
glutInitWindowPosition(100,200);
/*创建窗口*/
glutCreateWindow("display list");
/*绘制与显示*/
myInit();
glutReshapeFunc(myReshape);
glutDisplayFunc(myDisplay);
/*进入GLUT事件处理循环*/
glutMainLoop();
return(0);
}
- OpenGL学习3
- opengl学习笔记(3)
- OpenGL学习记录3
- openGL学习笔记3
- OpenGL学习(3)
- OpenGL ES2学习笔记3
- OpenGL(3)学习网站
- 学习OPENGL
- OpenGL学习
- opengl 学习
- openGL学习
- openGL学习
- [OpenGL学习]
- OpenGL学习
- OpenGL学习
- openGL学习
- OpenGL学习
- OpenGL 学习
- 正则表达式学习参考
- 搭建OTA下载服务器
- 第十二课 日期处理
- XML的接口标准DOM与SAX的区别
- 变参数printf解析
- OpenGL学习3
- OpenGL学习1
- VB函数分析
- 【Unix/Linux】【系统】文件 —— 类型,属性,扩展名
- javascript中的内置对象
- 时间,空间和效率
- Present Perfect
- 聊聊Portal 说说门户 (一)
- jdbc封装工具类