OpenGL学习笔记(二)

还是通过一个程序来记忆其中的知识,我很喜欢这种学习方式

运行结果如图:
OpenGL学习笔记(二)_第1张图片

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

#define PI 3.1415926
int WinWidth, WinHeight;

void display()
{
    glClear(GL_COLOR_BUFFER_BIT);
    glColor3f(1.0, 0.0, 0.0);
    glLoadIdentity();

    //画分割线(点画线),分成四个视见区
    glLineStipple(2,0xAAAA);
    glEnable(GL_LINE_STIPPLE);
    glLineWidth(10);
    glViewport(0, 0, WinWidth, WinHeight);
    glBegin(GL_LINES);
    glVertex2f(-1.0, 0);
    glVertex2f(1.0, 0);
    glVertex2f(0.0, -1.0);
    glVertex2f(0.0, 1.0);
    glEnd();
    glDisable(GL_LINE_STIPPLE);

    //定义在左下角的区域
    glColor3f(0.0, 1.0, 0.0);
    glViewport(0, 0, WinWidth/2, WinHeight/2);
    glBegin(GL_POLYGON);
    glVertex2f(-0.5, -0.5);
    glVertex2f(-0.5, 0.5);
    glVertex2f(0.5, 0.5);
    glVertex2f(0.5, -0.5);
    glEnd();

    //定义在右上角的区域
    glColor3f(0.0, 0.0, 1.0);
    glViewport(WinWidth / 2, WinHeight / 2, WinWidth / 2, WinHeight / 2);//注意,后面这两个参数是高度和宽度,而不是坐标
    glBegin(GL_POLYGON);
    glVertex2f(-0.5, -0.5);
    glVertex2f(-0.5, 0.5);
    glVertex2f(0.5, 0.5);
    glVertex2f(0.5, -0.5);
    glEnd();

    //定义在左上角的区域
    glColor3f(1.0, 0.0, 0.0);
    glViewport(0, WinHeight / 2, WinWidth / 2, WinHeight / 2);//注意,后面这两个参数是高度和宽度,而不是坐标
    glBegin(GL_POLYGON);
    glVertex2f(-0.5, -0.5);
    glVertex2f(-0.5, 0.5);
    glVertex2f(0.5, 0.5);
    glVertex2f(0.5, -0.5);
    glEnd();

    //定义在右下角
    glColor3f(1.0, 1.0, 1.0);
    glViewport(WinWidth / 2, 0, WinWidth / 2, WinHeight / 2);//注意,后面这两个参数是高度和宽度,而不是坐标
    glBegin(GL_POLYGON);
    glVertex2f(-0.5, -0.5);
    glVertex2f(-0.5, 0.5);
    glVertex2f(0.5, 0.5);
    glVertex2f(0.5, -0.5);
    glEnd();

    glutSwapBuffers();
}

void Reshape(int w, int h)
{
    WinWidth = w;
    WinHeight = h;
    // //改变显示区域,起始位置为客户端窗口左下角,然后宽高
    glViewport(0, 0, w, h);
    //宽高比改为当前值,视线区域与屏幕大小一致;
    //gluPerspective(45, 1.0*w / h, 1, 1000);
}


int main(int argc, char *argv[])
{
    WinWidth = 400;
    WinHeight = 800;
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DEPTH | GLUT_RGB | GLUT_DOUBLE);
    //glutInitWindowPosition(100, 100);
    glutInitWindowSize(WinWidth, WinHeight);
    glutCreateWindow("opengl test4");

    //定义剪裁面
    //gluOrtho2D(-1.0, 1.0, -1.0, 1.0);
    glutDisplayFunc(display);
    glutReshapeFunc(Reshape);


    glutMainLoop();
    return 0;
}

新出现的内容:
1、glLineStipple(2,0xAAAA);
这个是说明点画线的,他有两个参数,第二个参数为16位的二进制串,0表示这个像素不绘制,1表示绘制。前面一个参数表示每个0或1的长度,也就是说比如上面,第一个参数为2,后面是1010 1010 1010 1010,则他的意思就是,绘制两个像素,空两个,再绘制两个这样下去。但是这个点画线的功能默认是关闭的。需要使用下面一个函数glEnable(GL_LINE_STIPPLE);来把这个功能打开,这样以后画的线都是点画线,关闭用glDisable(GL_LINE_STIPPLE);

2、glLineWidth(10);
这个函数的功能为将线条的宽度设置成10个像素宽

3、glBegin(GL_LINES);
glVertex2f(-1.0, 0);
glVertex2f(1.0, 0);
glVertex2f(0.0, -1.0);
glVertex2f(0.0, 1.0);
glEnd();

这个是一系列的绘制过程,由glBegin( );开始。这个函数有一个参数表示你接下来要绘制的是什么图形可以添加的参数为:

GL_POINTS:把每一个顶点作为一个点进行处理,顶点n即定义了点n,共绘制N个点

GL_LINES:把每一个顶点作为一个独立的线段,顶点2n-1和2n之间共定义了n条线段,总共绘制N/2条线段

GL_LINE_STRIP:绘制从第一个顶点到最后一个顶点依次相连的一组线段,第n和n+1个顶点定义了线段n,总共绘制n-1条线段

GL_LINE_LOOP:绘制从第一个顶点到最后一个顶点依次相连的一组线段,然后最后一个顶点和第一个顶点相连,第n和n+1个顶点定义了线段n,总共绘制n条线段

GL_TRIANGLES:把每个顶点作为一个独立的三角形,顶点3n-2、3n-1和3n定义了第n个三角形,总共绘制N/3个三角形
  

GL_TRIANGLE_FAN:绘制一组相连的三角形,三角形是由第一个顶点及其后给定的顶点确定,顶点1、n+1和n+2定义了第n个三角形,总共绘制N-2个三角形
  

GL_QUAD_STRIP:绘制一组相连的四边形。每个四边形是由一对顶点及其后给定的一对顶点共同确定的。顶点2n-1、2n、2n+2和2n+1定义了第n个四边形,总共绘制N/2-1个四边形
  
GL_POLYGON:绘制一个凸多边形。顶点1到n定义了这个多边形。

并且需要注意的是,在glBegin( )和glEnd( )之间并不是所有的语句都是有效的,有些OpenGL语句虽然写上去但是不会执行,有些则会出现未定义等报错。这里指的是OpenGL语句,但是c++的比如for什么的语句是没有问题的。

在glBegin()和glEnd()之间可调用的函数
函数 函数意义
glVertex*() 设置顶点坐标
glColor*() 设置当前颜色
glIndex*() 设置当前颜色表
glNormal*() 设置法向坐标
glEvalCoord*() 产生坐标
glCallList(),glCallLists() 执行显示列表
glTexCoord*() 设置纹理坐标
glEdgeFlag*() 控制边界绘制
glMaterial*() 设置材质

注释:带*表示函数簇,比如第一个就包括
glVertex2d()
glVertex2dv()
glVertex2f()
glVertex2fv()
glVertex2i()
glVertex3d()
glVertex3dv()
。。。。。。。
等等一系列的函数。

4、glViewport(0, 0, WinWidth/2, WinHeight/2);
这个函数我觉得十分重要,注意后面两个参数的意思不是坐标,而是宽和高。前面两个坐标表示左下角的坐标。详解请看OpenGL学习笔记(一)里面推荐的博文。

5、glutDisplayFunc(display);
glutReshapeFunc(Reshape);
glutMainLoop();
在main里面的这三个函数我觉得有必要单独记录一下。
glutMainLoop();是一个消息处理函数,在我的理解就是谁有消息了我就处理谁。就我们这个程序而言,虽然glutDisplayFunc(display);写在前面,但是我的glutReshapeFunc(Reshape);会先运行,因为在我创建窗口的时候视口的大小就发生了改变。程序显示画面以后,假如我拖动窗口的一个角落。在我拖动的过程中,glutReshapeFunc(Reshape);会一直运行,改变一点就运行。直到你松开鼠标,窗口不再改变才运行glutDisplayFunc(display);OpenGL还有很多类似的函数,检测鼠标键盘等等的,推荐一个博客glut 消息事件处理函数

有错误或问题请留言,我觉得交流起来我们打击一起学习才会有进步。

参考:http://blog.csdn.net/why_study/article/details/8204838

你可能感兴趣的:(C++,opengl,opengl)