学习《Opengl编程指南》第7版 第2章(一)

来源:互联网 发布:api数据对原油的影响 编辑:程序博客网 时间:2024/06/09 22:09

(一)画点、直线、多边形

在这里提供《Opengl编程指南》第7版的电子版书、及源代码下载,方便大学参考学习,

下载地址:http://download.csdn.net/detail/jujueduoluo/5617639

我不准备讲一些概念,直接贴代码,然后对代码进行解释:

1)画圆

#include <gl/glut.h>

#include <cmath>

const int vertexNum = 100;
const GLfloat Pi = 3.1415926536f;

void DrawCircle(void)
{
 glClearColor(0.0,0.0,0.0,0.0);
 glClear(GL_COLOR_BUFFER_BIT);
 GLfloat vertexVal;
 glColor3f(1.0,0.0,0.0);
 glBegin(GL_LINES);
 for (int i=0; i<vertexNum; ++i)
 {
  vertexVal = 2*Pi*i/vertexNum; 
  glVertex2f(sin(vertexVal),cos(vertexVal));
 }
 glEnd();
 
 glFlush();

}

int main(int argc,char** argv)
{
 glutInit(&argc,argv);
 glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
 glutInitWindowSize(500,500);
 glutInitWindowPosition(100,100);
 glutCreateWindow("hello");
 glutDisplayFunc(DrawCircle);
 glutMainLoop();

 return 0;
}

glCearColor   设置当前清除颜色,用于清除RGBA模式下的颜色缓冲区。red、green、blue和alpha值会根据需要截取,其范围限定在【0,1】之内,默认颜色为(0,0,0,0),也就是黑色

glclear 用当前缓冲区清除值清除指定的缓冲区;缓冲区有GL_COLOR_BUFFER_BIT(颜色缓冲区)、GL_DEPTH_BUFFER_BIT(深度缓冲区)等

GLfloat 是Opengl的类型定义,表示32位的float类型,关于Opengl的类型定义,请参考书里面Opengl函数的语法

glColor3f  设置颜色,范围在0.0--1.0之间的浮点数

glVertex2f  用于指定顶点

其它的已经在第1章有过介绍,这里就不在重复,看一下运行效果

2)画正弦

void DrawSin(void)
{
 glClearColor(0.0,0.0,0.0,0.0);
 glClear(GL_COLOR_BUFFER_BIT);
 glColor3f(1.0,0.0,0.0);
 glBegin(GL_LINES);
 //画X、Y轴
 glVertex2f(-1.0,0.0);
 glVertex2f(1.0,0.0);
 glVertex2f(0.0,1.0);
 glVertex2f(0.0,-1.0);

 
 
 //画正弦
 for(GLfloat i=-1.0; i<1.0; i += 0.1*factor)
 {
  glVertex2f(i,sin(Pi*i));
 }


 glEnd();
 glFlush();
}

运行效果:

3)画余弦

void DrawCos(void)
{
 glClearColor(0.0,0.0,0.0,0.0);
 glClear(GL_COLOR_BUFFER_BIT);
 glColor3f(0.0,1.0,0.0);
 glBegin(GL_LINES);
 //画X、Y轴
 glVertex2f(-1.0,0.0);
 glVertex2f(1.0,0.0);
 glVertex2f(0.0,1.0);
 glVertex2f(0.0,-1.0);

 

 //画余弦
 for(GLfloat i=-1.0; i<1.0; i += 0.1*factor)
 {
  glVertex2f(i,cos(Pi*i));
 }


 glEnd();
 glFlush();
}

 

效果如下:

大家可以把glBegin函数的的参数,变换一下,如换成:GL_POINTS、GL_LINE_STRIP等,然后看看他们的运行效果,具体的可以查下glBegin有哪些参数

4)坐标系统

这里简单的介绍二维坐标系统,无论是在刚打开窗口、还是以后移动窗口、改变窗口大小的时候,窗口系统都会发送一个事件传为通知。如果使用的是GLUT工具库,

它会自动产生通知,并且在glutReshapeFunc中注册的那个函数会被调用。另外,必顺注册一个回调函数,完成下列这些任务:

a)重新建立一个矩形区域,把它作为新的渲染画布。

b)定义一个用于绘制物体的坐标系统。

可以像这样使用:

void reshape(int w,int h)

{

     glViewport(0,0,w,h);

     glMatrixMode(GL_PROJECTION);

     glLoadIdentity();

    gluOrtho2D(0.0,w,0.0,h);

}

这个reshape是作为glutReshapeFunc函数的回调函数