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);
}

原创粉丝点击