zoukankan      html  css  js  c++  java
  • OpenGL学习笔记2——顶点数组

      1 #pragma comment(lib,"glut32.lib")
      2 #pragma comment(lib,"glut.lib")
      3 #pragma comment(lib,"GlU32.lib")
      4 #include<GLglut.h>
      5 #include<Windows.h>
      6 //use vertex_array way to draw primitives
      7 //globle variable
      8 //立方体八个定点的三维数据坐标
      9 GLfloat VertexData[] = {
     10     -0.5f, -0.5f, -0.5f,
     11      0.5f, -0.5f, -0.5f,
     12     -0.5f,  0.5f, -0.5f,
     13      0.5f,  0.5f, -0.5f,
     14     -0.5f, -0.5f,  0.5f,
     15      0.5f, -0.5f,  0.5f,
     16     -0.5f,  0.5f,  0.5f,
     17      0.5f,  0.5f,  0.5f,
     18 };
     19 //立方体六个表面的定点索引数据,无论坐标系如何变幻,
     20 //任何时刻最多显示3个面,因此如果在数据处理多面体时候只
     21 //处理显示的“正面”数据则可以大大减少3d图像处理的开销和功耗
     22 //当初做过实验,在glutIdleFunc()函数中不断调用画图子程序,使得cpu的内核温度飙升到90°……
     23 //那么,GL中规定逆时针的面为正面,因此面对3d图形时候,其顶点索引顺时针填写将在
     24 //后续处理中设定为背面,而逆时针面被设定为正面
     25 static GLubyte VertexIndex[][4] = {
     26     0, 2, 3, 1,
     27     0, 4, 6, 2,
     28     0, 1, 5, 4,
     29     4, 5, 7, 6,
     30     1, 3, 7, 5,
     31     2, 6, 7, 3,
     32 };
     33 float rotate;
     34 //protype
     35 void DrawCube(void);
     36 void Timer0(int id);
     37 void DisplayFunc(void);
     38 float GetRand(int,int);
     39 //main function
     40 void main(int argc, char **argv) 
     41 {
     42     //Init windows
     43     glutInit(&argc, argv);
     44     glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);
     45     glutInitWindowPosition(0,0);
     46     glutInitWindowSize(800,800);
     47     glutCreateWindow("Cube");
     48     //register display
     49     glutDisplayFunc(DisplayFunc);
     50     glutTimerFunc(20,Timer0,0);
     51     //message loop
     52     glutMainLoop();
     53 }
     54 //sub-function implement
     55 void DisplayFunc(void)
     56 {
     57     glClearColor(0.0,0.0,0.0,0.0);
     58     glClear(GL_COLOR_BUFFER_BIT);
     59     glFlush();
     60 }
     61 //此处引用定点数据进行绘制,定点数组绘制相比用普通的点点绘制最终
     62 //的效果是一致的,优化在于减少了函数开销,比如使用普通点点绘制
     63 //对于立方体的一个定点,在完成一个完整立方体的时候被重复调用3次
     64 //全遍历。
     65 //在此说明opengl是基于客户和服务器的架构,对于本地运行的opengl应用程序来讲
     66 //应用程序可以看成是客户,GL内核是服务器(更准确是包括GPU部分)。之所以在此
     67 //提及服务器和客户的概念,是为后续缓冲对象的应用背景做个铺垫。
     68 //定点数组数据以及定点索引数据是存储在客户端。
     69 //对于室内物体无线定位来讲,一个立方体就足够标记一个物体了,使用定点数据将数据存储在客户端就已经够用了,需要的时候
     70 //发往GPU的内存里就行(送到服务器端)。
     71 void DrawCube(void)
     72 {
     73     //enable vertex_array
     74     glEnableClientState(GL_VERTEX_ARRAY);
     75     //load vertex_array data
     76     glVertexPointer(3,GL_FLOAT,3*sizeof(GLfloat),VertexData);
     77     //drawing operation
     78     glDrawElements(GL_QUADS,sizeof(VertexData),GL_UNSIGNED_BYTE,VertexIndex);
     79 }
     80 void Timer0(int id)
     81 {
     82     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
     83     glMatrixMode(GL_MODELVIEW); 
     84     glLoadIdentity();
     85     glPushMatrix();
     86     glLineWidth(2.4);
     87 //默认的多边形表面是以填充的形式绘制,此处设置为轮廓线绘制
     88     glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);
     89     //设定逆时针为正面
     90     glFrontFace(GL_CCW);
     91 //由于采用了矩阵压栈和出栈的处理,使得此处旋转的角度采用全局变量,存储角度
     92     //旋转角度实则对360°为一个周期。
     93     rotate += GetRand(0,6)/10;
     94     glRotatef(rotate,1,0,0);
     95     glRotatef(rotate,0,1,0);
     96     glRotatef(rotate,0,0,1);
     97     DrawCube();
     98     glPopMatrix();
     99     glutSwapBuffers();
    100     glutTimerFunc(20,Timer0,0);//for continue timer counting
    101 }
    102 float GetRand(int start,int end)
    103 {
    104     return start + (end - start)*rand()/(RAND_MAX + 1.0);
    105 }
  • 相关阅读:
    BPC (9) SAP BI & BPC 安装 : 一个外行眼里的千奇百怪 (1)
    ESB (2) POCSofewareAG
    BPC (7) BPC Netweaver 7 和 microsoft 7 版本的差异
    ESB (3) POCOralce ESB
    厘清了xorg里的一些概念
    Top命令和Kill命令
    ubuntu中文英文环境切换
    /etc/passwd 文件内容详细解释
    [分享] Linux下用Anjuta写个Hello World 的C++程序竟如此简单!
    /proc目录
  • 原文地址:https://www.cnblogs.com/loadomain/p/3452219.html
Copyright © 2011-2022 走看看