OpenGL学习笔记2——顶点数组
#pragma comment(lib,"glut32.lib")
#pragma comment(lib,"glut.lib")
#pragma comment(lib,"GlU32.lib")
#include<GL\glut.h>
#include<Windows.h>
//use vertex_array way to draw primitives
//globle variable
//立方体八个定点的三维数据坐标
GLfloat VertexData[] = {
-0.5f, -0.5f, -0.5f,
0.5f, -0.5f, -0.5f,
-0.5f, 0.5f, -0.5f,
0.5f, 0.5f, -0.5f,
-0.5f, -0.5f, 0.5f,
0.5f, -0.5f, 0.5f,
-0.5f, 0.5f, 0.5f,
0.5f, 0.5f, 0.5f,
};
//立方体六个表面的定点索引数据,无论坐标系如何变幻,
//任何时刻最多显示3个面,因此如果在数据处理多面体时候只
//处理显示的“正面”数据则可以大大减少3d图像处理的开销和功耗
//当初做过实验,在glutIdleFunc()函数中不断调用画图子程序,使得cpu的内核温度飙升到90°……
//那么,GL中规定逆时针的面为正面,因此面对3d图形时候,其顶点索引顺时针填写将在
//后续处理中设定为背面,而逆时针面被设定为正面
static GLubyte VertexIndex[][] = {
, , , ,
, , , ,
, , , ,
, , , ,
, , , ,
, , , ,
};
float rotate;
//protype
void DrawCube(void);
void Timer0(int id);
void DisplayFunc(void);
float GetRand(int,int);
//main function
void main(int argc, char **argv)
{
//Init windows
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);
glutInitWindowPosition(,);
glutInitWindowSize(,);
glutCreateWindow("Cube");
//register display
glutDisplayFunc(DisplayFunc);
glutTimerFunc(,Timer0,);
//message loop
glutMainLoop();
}
//sub-function implement
void DisplayFunc(void)
{
glClearColor(0.0,0.0,0.0,0.0);
glClear(GL_COLOR_BUFFER_BIT);
glFlush();
}
//此处引用定点数据进行绘制,定点数组绘制相比用普通的点点绘制最终
//的效果是一致的,优化在于减少了函数开销,比如使用普通点点绘制
//对于立方体的一个定点,在完成一个完整立方体的时候被重复调用3次
//全遍历。
//在此说明opengl是基于客户和服务器的架构,对于本地运行的opengl应用程序来讲
//应用程序可以看成是客户,GL内核是服务器(更准确是包括GPU部分)。之所以在此
//提及服务器和客户的概念,是为后续缓冲对象的应用背景做个铺垫。
//定点数组数据以及定点索引数据是存储在客户端。
//对于室内物体无线定位来讲,一个立方体就足够标记一个物体了,使用定点数据将数据存储在客户端就已经够用了,需要的时候
//发往GPU的内存里就行(送到服务器端)。
void DrawCube(void)
{
//enable vertex_array
glEnableClientState(GL_VERTEX_ARRAY);
//load vertex_array data
glVertexPointer(,GL_FLOAT,*sizeof(GLfloat),VertexData);
//drawing operation
glDrawElements(GL_QUADS,sizeof(VertexData),GL_UNSIGNED_BYTE,VertexIndex);
}
void Timer0(int id)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glPushMatrix();
glLineWidth(2.4);
//默认的多边形表面是以填充的形式绘制,此处设置为轮廓线绘制
glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);
//设定逆时针为正面
glFrontFace(GL_CCW);
//由于采用了矩阵压栈和出栈的处理,使得此处旋转的角度采用全局变量,存储角度
//旋转角度实则对360°为一个周期。
rotate += GetRand(,)/;
glRotatef(rotate,,,);
glRotatef(rotate,,,);
glRotatef(rotate,,,);
DrawCube();
glPopMatrix();
glutSwapBuffers();
glutTimerFunc(,Timer0,);//for continue timer counting
}
float GetRand(int start,int end)
{
return start + (end - start)*rand()/(RAND_MAX + 1.0);
}
OpenGL学习笔记2——顶点数组的更多相关文章
- OpenGL学习笔记3——缓冲区对象
在GL中特别提出了缓冲区对象这一概念,是针对提高绘图效率的一个手段.由于GL的架构是基于客户——服务器模型建立的,因此默认所有的绘图数据均是存储在本地客户端,通过GL内核渲染处理以后再将数据发往GPU ...
- OpenGL学习笔记:拾取与选择
转自:OpenGL学习笔记:拾取与选择 在开发OpenGL程序时,一个重要的问题就是互动,假设一个场景里面有很多元素,当用鼠标点击不同元素时,期待作出不同的反应,那么在OpenGL里面,是怎么知道我当 ...
- RX学习笔记:JavaScript数组操作
RX学习笔记:JavaScript数组操作 2016-07-03 增删元素 unshift() 在数组开关添加元素 array.unshift("value"); array.un ...
- [转]OpenGL通过VBO实现顶点数组绘制顶点
#include "stdlib.h" #include <OpenGL/glext.h> #include <GLUT/GLUT.h> #define B ...
- Go语言学习笔记八: 数组
Go语言学习笔记八: 数组 数组地球人都知道.所以只说说Go语言的特殊(奇葩)写法. 我一直在想一个人参与了两种语言的设计,但是最后两种语言的语法差异这么大.这是自己否定自己么,为什么不与之前统一一下 ...
- OpenGL学习笔记(1) 画一个三角形
最近找实习有一丢丢蛋疼,沉迷鬼泣5,四周目通关,又不想写代码,写篇笔记复习一下,要好好学图形学啊 用OpenGL画一个三角形 项目的简介 记录一下跟着learnOpenGL学习的过程 笔记里的代码放在 ...
- OpenGL学习笔记(六)坐标系统
目录 一.衔接 二.概述 三.各个坐标系统 局部空间 世界空间 观察空间 裁剪空间 四.两种投影矩阵 正射投影 透视投影 五.把它们都组合到一起 六.编码实现 1. 实现卡片旋转 2. 实现正方体旋转 ...
- C语言学习笔记之成员数组和指针
成员数组和指针是我们c语言中一个非常重要的知识点,记得以前在大学时老师一直要我们做这类的练习了,但是最的还是忘记了,今天来恶补一下. 单看这文章的标题,你可能会觉得好像没什么意思.你先别下这个 ...
- opengl学习笔记
准备: 1.准备资源:从GLEW1.13.0下载GLEW,并且解压出glew-1.13.0目录.从FreeGLUT官网下载3.0.0版本.直接从这里下的编译后的FreeGLUT,选for MSVC,下 ...
随机推荐
- 过滤emoji表情
str=str.replace(/\ud83c[\udf00-\udfff]|\ud83d[\udc00-\ude4f]|\ud83d[\ude80-\udeff]/g, "");
- php捕捉来自搜索引擎的用户IP地址时间和访问路径
刚才看demo看到很有意思的地方记录一下 $zz_page=$_SERVER['REQUEST_URI']; $zz_name=$_SERVER['HTTP_USER_AGENT']; $zz_ip= ...
- toggle()方法和hove()方法
toggle()语法结构: toggle(fn1,fn2,fn3,....fnN); 第一次单击元素,触发第一个元素,再次单击触发第二个元素,如果有更多元素,依次触发,直到最后一个元素,随后单击反复对 ...
- JSBInding+Bridge.NET:把C#编译为Js
编译步骤: 1. 用 VS 2015 打开 BridgeProj/BridgeProj.sln ,编译 2. 将生成 BridgeProj/Bridge/output/bridge.js,对应于 Br ...
- DEX 方法超过64K限制和gradle编译OOM问题解决
如果你是一个android开发者,你至少听说过的Dalvik的蛋疼的64K方法限制.概括地说,在一个DEX文件,你可以调用很多的方法,但你只能调用它们最前面的65,536个 ,因为这是在方法调用集合中 ...
- clientX、pageX、scrollLeft、offsetLeft、clientWidth、screen.width的用法和区别
一.定义和用法 1.event.clientX:事件对象的水平偏移量: event.clientY:事件对象的垂直偏移量: 2.event.pageX:事件对象加上滚动距离后的水平偏移量: event ...
- asp.net 自定义控件 嵌入资源文件 备忘
要想在自定义用户控件中嵌入资源,从以下几个步骤入手: 1.在AssemblyInfo.cs中注册资源,文件夹层级用点隔开.例如: [assembly: System.Web.UI.WebResourc ...
- html/京东项目/京东网页高仿/js/jq/css/java web/
登录部分HTML+CSS: <!DOCTYPE html><html> <head> <meta charset="UTF-8& ...
- [linux]解决vsftpd 读取目录列表失败的问题
使用第三方FTP软件filezilla进行登陆,出现如下错误:状态: 正在连接 192.168.1.6:21...状态: 连接建立,等待欢迎消息...响应: 220 (vsFTPd ...
- 【转】libevent和基于libevent的网络编程
转自: http://www.cnblogs.com/nearmeng/p/4043548.html 1 libevent介绍和安装 介绍 libevent是一个轻量级的基于事件驱动的高性能的开源网络 ...