zoukankan      html  css  js  c++  java
  • 【OpenGL】【计算机图形学原理】撸课本系列一

    P13 简单二维图元的生成方法

    #include <GL/glut.h> //用于表示openGL允许采用
    glClear(GL_COLOR_BUFFER_BIT); //清除颜色缓存

    glClear()用于表示清除缓存,可以用 “|” 组合不同的缓冲标识符。缓冲标识符有四种。

    • GL_COLOR_BUFFER_BIT
    • GL_DEPTH_BUFFER_BIT
    • GL_ACCUM_BUFFER_BIT
    • GL_STENCIL_BUFFER_BIT

    glClear(GL_COLOR_BUFFER_BIT)表示把整个窗口清除为黑色。

    glClearColor(0.0,0.0,0.0,0.0)表示清楚颜色设为黑色。

    其余的缓冲标识符也有相对应的函数。

    glPointSize(3.0); //指定栅格化点的直径

    glPointSize()一定要用于画点开始前,即glBegin()前。 

    对应的glBegin()中的参数必须为GL_POINTS或GL_POINT。

    一些常见错误:

    • 如果size小于或等于零,则生成GL_INVALID_VALUE。
    • 如果在调用glBegin和相应的glEnd调用之间调用glPointSize,则会生成GL_INVALID_OPERATION。
    glBegin(GL_POINTS); //画点开始

    glBegin()与glEnd()配合使用。

    函数原型为void glBegin(GLenum mode)。

    mode中的参数可以是点或线等。

    • 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_STPIP:绘制一组相连的三角形,对于奇数n,顶点n,n+1,和n+2定义了第n个三角形;对于偶数n,顶点n+1,n和n+2定义了第n个三角形,绘制N-2个三角形。
    • GL_QUADS: 绘制由四个顶点组成的一组单独的四边形。顶点4n-3,4n-2,4n-1和4n定义了第n个四边形。绘制了N/4个四边形。
    • GL_QUAD_STRIP:绘制一组相连的四边形。每个四边形是由一对顶点及其后给定的一对顶点共同确定的。顶点2n-1,2n,2n+2和2n+1定义了第n个四边形,绘制了N/2-1个四边形。
    • GL_POLYGON: 绘制了一个凸多边形。顶点1到n定义了这个多边形
    glVertex2f(0.0, 0.0); //指定点

    用于指定一个点,由glVertex函数为前缀,后跟一个数字,用于表明指定点的维数(同为参数的个数),最后跟一个字母,用于表示参数的类型。

    • s 表示16位整数(OpenGL中将这个类型定义为GLshort);
    • i 表示32位整数(OpenGL中将这个类型定义为GLint和GLsizei);
    • f 表示32位浮点数(OpenGL中将这个类型定义为GLfloat和GLclampf);
    • d 表示64位浮点数(OpenGL中将这个类型定义为GLdouble和GLclampd);
    • v 表示传递的几个参数将使用指针的方式;

    参数的数值范围为-1~1 (在标准视图中),如果超出这个范围就会消失在视图中。 (tips:如果在视图中找不到点,检查参数范围)

    glEnd(); //画点结束

    在glBegin()和glEnd()中间可以使用的函数

    • glVertex*() 设置顶点坐标
    • glColor*() 设置当前颜色
    • glIndex*() 设置当前颜色表
    • glNormal*() 设置法向坐标
    • glEvalCoord*() 产生坐标
    • glCallList(),glCallLists() 执行显示列表
    • glTexCoord*() 设置纹理坐标
    • glEdgeFlag*() 控制边界绘制
    • glMaterial*() 设置材质
    glFlush(); //清空缓冲区,将指令送往硬件立即执行(强制刷新)

    通常情况下,OpenGL指令不是立即执行的,它们首先被送到指令缓冲区,然后才被送到硬件执行。glFinish()和glFlush()都是强制将命令缓冲区的内容提交给硬件执行。

    glFlush()将命令传达完毕后立即返回,不会等待指令执行完毕。这些指令会在有限时间内执行完毕。

    glutInit(&argc, argv); //GLUT初始化

    argc:一个指针,指向从main()函数传递过来的没更改的argc变量。

    argv:一个指针,指向从main()函数传递过来的没更改的argv变量。

    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); //定义显示方式

    函数原型:void glutInitDisplayMode(unsigned int mode)。

    mode可以指定显示模式

    • GLUT_RGBA或者GLUT_RGB。指定一个RGBA窗口,这是一个默认的颜色模式。
    • GLUT_INDEX。指定颜色索引模式。
    • GLUT_SINGLE.单缓冲区窗口。
    • GLUT_BUFFER.双缓冲区窗口,这是产生流畅动画必须选的。
    • GLUT_ACCUM.累积缓冲区。
    • GLUT_STENCIL.模板缓冲区。
    • GLUT_DEPTH.深度缓冲区。

    可以用“|”来建立自己想要的多个显示模式。

    glutInitWindowPosition(0, 0); //确定窗口位置(默认是屏幕左上角)

    函数原型:void glutInitWindowPosition(int x,int y)

    x表示距离屏幕左边的像素数。-1是默认值,即由窗口管理程序决定窗口出现在哪里,可以自己设置值来确定位置。

    y表示屏幕上边的像素值,类似x值。

    glutInitWindowSize(240, 240); //设置窗口大小

    函数原型:void glutInitWindowSize(int width,int height)

    width表示窗口的宽度

    height表示窗口的高度

    避免使用负数

    glutCreateWindow(argv[0]); //创建窗口

    函数原型:int glutCreateWindow(char* title)

    title为窗口的标题

    glutDisplayFunc(display); //绘图函数

    函数原型:void glutDisplayFunc(void (*func)(void));

    func当窗口需要被重绘时调用的函数的名称,用NULL作为实参是错误的。

    程序运行时自动调用。

    glutMainLoop(); //循环

    完整代码:

    #include <GL/glut.h>
    
    void display(void) {
        glClear(GL_COLOR_BUFFER_BIT);
    
        glPointSize(3.0);
        glBegin(GL_POINTS);
        glVertex2f(0.0, 0.0);
        glEnd();
    
        glPointSize(6.0);
        glBegin(GL_POINTS);
        glVertex2f(0.5, 0.5);
        glVertex2f(-0.5, 0.5);
        glVertex2f(0.5, -0.5);
        glVertex2f(-0.5, -0.5);
        glEnd();
    
        glFlush();
    }
    
    int main(int argc, char * * argv) {
        glutInit(&argc, argv);
        glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
        glutInitWindowPosition(0, 0);
        glutInitWindowSize(240, 240);
        glutCreateWindow(argv[0]);
        glutDisplayFunc(display);
        glutMainLoop();
        return 0;
    }

    效果图:

  • 相关阅读:
    敏捷开发中的故事点到底是什么?如何预估故事点?
    Worktile 进军软件开发与协作的初心与野心
    宽带无法登陆GitHub解决——修改host
    IDEA自定义类注释和方法注释(自定义groovyScript方法实现多行参数注释)
    SpringBoot2.x整合redis和使用redis缓存
    简单聊聊JVM
    IDEA打包web项目为war,通过本地Tomcat启动war
    多表更新
    unittest suite集合实现原理
    14.0 native webview H5切换
  • 原文地址:https://www.cnblogs.com/whdsunny/p/9996957.html
Copyright © 2011-2022 走看看