• OpenGL几何图元与缓冲区


    OpenGL几何图元与缓冲区

      顶点:glVertex,有三种形式(x, y, 1),(x, y, z),(x, y, z, w)。设置点的大小glPointsize,获得受支持的点的大小范围与增量大小。

    GLfloat sizes[2];
    GLfloat step;
    glGetFloatv(GL_POINT_SIZE_RANGE, size);
    glGetFloatv(GL_POINT_SIZE_GRANULARITY, &step);

      直线

    glBegin(GL_LINES);
        glVertex3f(x0, y0, z0);
        glVertex3f(x1, y1, z1);
    glEnd();
    
    glBegin(GL_LINE_STRIP);
        glVertex3f(x0, y0, z0);
        ...
    glEnd();
    
    glBegin(GL_LINR_LOOP);
        ...
    glEnd();
    
    //设置直线宽度
    void glLineWidth(GLfloat width);
    //获得所支持的直线的宽度范围与增量
    GLfloat widthRange[2];
    GLfloat step;
    glGetFloatv(GL_LINE_WIDTH_RANGE, widthRange);
    glGetFloatv(GL_LINE_WIDTH_GRANULARITY, &step);
    
    //点画直线
    glEnable(GL_LINE_STIPPLE);
    void glLineStipple(GLint factor, GLushort pattern);  

      三角形

    glBegin(GL_TRIANGLES);
        ...
    glEnd();
    
    glBegin(GL_TRIANGLE_STRIP);
        ...
    glEnd();
    
    glBegin(GL_TRIANGLE_FAN);
        ...
    glEnd();
    
    //单调着色,用当前颜色(多边形最后一个顶点的颜色)填充这个多边形
    glShadeModel(GL_FLAT);
    //渐变着色,根据每个顶点对三角形进行渐变着色,对相邻顶点的颜色进行均和
    glShadeModel(GL_SMOOTH);
    
    //启动深度测试
    glEnable(GL_DEPTH_TEST);
    //禁用深度测试
    glDisable(GL_DEPTH_TEST);
    //清除颜色缓冲与深度缓冲区
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

      顶点的指定次序以及方向的组合称为环绕,可以通过环绕方向确定多边形所显示的是正面还是反面。在默认情况下,OpenGL认为逆时针方向环绕的一面是多边形的正面。可以使用函数glFrontFace(GL_CW)设置顺时针环绕方向的多边形表示的是正面,glFrontFace(GL_CCW)可以恢复到默认状态。

      glPolygonMode设置多边形作为实心图形、外框、或者点进行渲染。

      四边形

    glBegin(GL_QUADS);
        ......
    glEnd();
    
    glBegin(GL_QUDA_STRIP);
        .....
    glEnd();

      多边形

    glBegin(GL_POLYGON);
        ....
    glEnd();

      使用多边形创建一个复杂的表面时,需要记住两个重要的规则。第一个规则是所有的多边形都必须是平面的(每个多边形的所有顶点都必须位于同一个平面中);第二个规则是多边形的边必须不相交,并且多边形必须是凸的。

      OpenGL并不是直接在屏幕上渲染图元的,而是在一个缓冲区中完成渲染,然后在把渲染结果交换到屏幕上,这两个缓冲区称为前颜色缓冲区(屏幕)和后颜色缓冲区。在默认情况下,OpenGL命令是在后缓冲区进行渲染的,并且调用glutSwapBuffers(或者操作系统特定的缓冲区交换函数)函数时,前后缓冲区就会进行交换,从而看到渲染效果。指定缓冲区进行渲染,如:glDrawBuffer(GL_FRONT)、glDrawBuffer(GL_BACK)。深度缓冲区请求GLUT_DEPTH,glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH)。

      glEnable(GL_SCISSOR_TEST),glScissor指定裁剪框进行渲染,让渲染只在这个区域进行。

      请求模板缓冲区glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_STENCIL),打开模板操作glEnable(GL_STENCIL_TEST),打开了模板测试后,绘图只能在那些通过了模板测试的位置进行,模板测试函数void glStencilTest(GLenum func, GLint ref, GLuint mask);

    参考资料
    1. OpenGL SuperBible

  • 相关阅读:
    Spring与MyBatis整合应用
    Spring与JDBC整合应用
    登录权限检查(SpringMVC)
    SpringMVC中文乱码问题
    SpringMVC异常处理
    SpringMVC注解应用
    Viewpager+fragment数据更新问题解析
    android adb 读写模式 挂载文件系统
    Android网络通信两种方法
    Win7、win2008中让IIS7支持asp的方法
  • 原文地址:https://www.cnblogs.com/corfox/p/5415005.html
Copyright © 2020-2023  润新知