zoukankan      html  css  js  c++  java
  • [原]OpenGL基础教程(二)多边形绘制

    上篇介绍了最基本的三角形绘制,本篇介绍如何使用索引的方式绘制多边行。

    为什么要使用索引方式,总体来说提高性能。如何提高:使用顶点数组的好处是避免大量的函数调用。即避免每画一个顶点就调用1次glVertex*()。
    另一个好处是避免多边形相邻顶点的冗余指定。例如正方体,分别描述6个正方形,会造成每个顶点被重复描述3次。

    如果以上没有说服力,看看这个, gl.Begin(),gl.End()对是一种低效的方式,因此opengl es干脆不再支持他们了,同时高版本的opengl都在弃用gl.Begin(),gl.End()

    先了解一些基本的API:

    (1)glEnableClientState(枚举值),参数支持顶点,颜色等等。作用激活选择的数组,例如:glEnableClientState(GL_VERTEX_ARRAY)表示激活顶点数组

    (2)glVertexPointer(size,type,stride,*pointer) size:每个顶点坐标的数量,type 每个坐标的数据类型,stride:连接顶点的之间的偏移值,pointer:顶点数据的指针;作用 :指定顶点数据的数组

    与之同类的包括 顶点 法线 纹理等等。

    (3)glDrawElements(model,count,type,indices) model:那种类型的图元(点 线 三角形等),count:数组的元素个数,type:数组中元素的数据类型,indices:存放索引的数组;作用:解引用数组元素的一个列表 我也没大明白啥意思,用熟了大概就理解了。

    (4)glutReshapeFunc(func)  窗口大小发生改变时 会回调func

    直接上代码:

    #include "stdafx.h"
    #include<gl/glut.h>  
    float vertices[] = {-50.0,-50.0,
        50.0,-50.0,
        -50.0,50.0,
        50.0,50.0};
    GLuint indexs[] = {0,1,2};
    void init()
    {
        glEnableClientState(GL_VERTEX_ARRAY);//激活顶点数组
        glVertexPointer(2,GL_FLOAT,0,vertices); 
    }
    void renderScene(void)  
    {  
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);  
        glDrawElements(GL_TRIANGLES,sizeof(indexs),GL_UNSIGNED_INT,indexs);//以三角形方式绘制 sizeof(indexs)取得数组元素的个数
        glutSwapBuffers();  
    }  
    
    void Reshape(GLsizei w,GLsizei h)
    {
        if(h<0)
        {
            h=1;
        }
        glViewport(0,0,w,h);
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        glOrtho(-100,100,-100,100,-100,100);
    }
    
    int _tmain(int argc, _TCHAR* argv[])  
    {  
        glutInit(&argc, (char**) argv);  
        glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);  
        glutInitWindowPosition(100,100);  
        glutInitWindowSize(320,320);  
        glutCreateWindow("Hello OpenGL");  
        glutDisplayFunc(renderScene); 
        glutReshapeFunc(Reshape);
        init();
        glutMainLoop();//enters the GLUT event processing loop.  
        return 0;  
    }  

    效果如下:

    (5)白色太难看了吧 来给上点色(下面不会再贴全部代码,贴核心代码)

    float colors[] = {1.0,0.0,0.0,
        1.0,0.0,0.0,
        1.0,0.0,0.0,
        1.0,0.0,0.0};//定义颜色数组

    初始化函数里面激活颜色数组 并绑定颜色数组

    glEnableClientState(GL_COLOR_ARRAY);
    glColorPointer(3,GL_FLOAT,0,colors);

    这不效果出来了:

    (6)绘制四边形,非常easy,只需要改一下数组的索引 GLuint indexs[] = {0,1,2,2,3,1};

    下一篇介绍多边形贴纹理

  • 相关阅读:
    JavaScript之DOM文档对象模型--对HTML元素的增删操作
    JavaScript之DOM文档对象模型--对HTML元素的访问操作
    JavaScript之BOM浏览器对象模型-history
    SpringBoot配置自定义日期参数转换器
    SpringMVC参数绑定(未完待续)
    一个简单的SpringBoot入门程序
    四种JavaEE架构简介
    浏览器禁用Cookie后的Session处理
    基础回顾: 关于Session的一些细节
    使用Cookie实现用户商品历史浏览记录
  • 原文地址:https://www.cnblogs.com/U-tansuo/p/opengl_Polygon_2.html
Copyright © 2011-2022 走看看