OpenGL学习笔记1——第一个程序
学习的参考书基本是按照GL编程指南,如果有消息机制概念,对于GLUT的理解是很自然的。下面就按照自己写的第一个程序详细解释一下GL,还是比较容易上手的。
程序实现的功能是,根据当前随即种子摇出来的结果来动态改变绿色十字架的线宽、坐标、颜色……不断绘制显示在屏幕。
注意,对于图形建模比如画线、画多边形等这些细节可以查阅书籍,不再重复点出来,网上千篇一律的东西还是很多的。下面的注解是个人的理解,包括参考、查阅其他资料。
需要提点的就是我目前用的是图书馆借出来的第四版GL编程指南,有些东西比较落后了,照搬的话可能不好使。目前的glut版本最新的是api version =4,应该是变动还不是特别大,这个可以读下glut头文件,而正规的参考手册spec只标注了api version=3。
不需要一下子就把什么库都装最新的,当遇到问题时候再一点点加。
#include<gl/glut.h>
#include<Windows.h>
#include<ctime>
//获取屏幕的大小,用了windows头文件的函数:GetSystemMetrics(SM_CXSCREEN),原意是想实现全屏显示,
//但是屏幕最后还是会留出窗口框,后来跟进使用glutFullScreen函数可以实现这样更能。
int ScreenWidth;
int ScreenHeight;
void ReDraw(void);
float GetRand(int,int);
void Timer0(int value);
/////////////////main////////////////////////
void main(int argc,char **argv)
{
srand(unsigned(time(0)));
glutInit(&argc,argv);
//显示模式设置,此处设置单缓存和RGB颜色。对于慢速绘制的小程序来说这个是受得了的
//但是如果帧速率过快或者象素过多处理复杂的情况下,应该使用缓冲,何为双缓冲,其实就是所谓的“乒乓操作”,
//这个概念在FPGA应用中也很常见,再简单点说就是个2级的流水线操作了。
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
//Full size of your windows
ScreenWidth = GetSystemMetrics(SM_CXSCREEN);
ScreenHeight = GetSystemMetrics(SM_CYSCREEN);
//一系列初始化窗口操作,如果是MFC或者是Visual C++则一个函数createwindows的事情。
glutInitWindowSize(ScreenWidth,ScreenHeight);
glutInitWindowPosition(0,0);
glutCreateWindow("AutoCross");
//init the background to black
//设置清屏操作时候显示的颜色,发现这个颜色实则是个4维的向量,目前只要了解前三分量是RGB即可。RGB分量是颜色的一种分解,
//这种分解其实在数字图像处理中没有HSI分解来的方便,但是RGB分解方式更符合自然。之所以说RGB处理起来不方便,是因为
//HSI是色度和亮度分离的变量,人眼对亮度和色度的敏感是不一样的,对亮度会更敏感一点。因此在改善图像质量情况下可以在色度和亮度上分别作文章,而RGB是什么,是象征每一种合成的颜色.
//人不可能对每种颜色都敏感,细微的变换很难被察觉。总之RGB是对外显示的效果,而其本质是HSI,就像处理时域波形很难描述地清楚的时候,转换到频域去就
//一目了然。另外在图像数据传输时候,在相同带宽下色亮分离传输容量比原始的RGB传输大。 glClearColor(0.0,0.0,0.0,0.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glPointSize(1.4);
//Set left-corner as source of cordinator
gluOrtho2D(0.0,ScreenWidth,0.0,ScreenHeight);
//finish windows initial
//此处涉及消息机制,但是被GLUT隐藏了,所有的消息(事件触发的标识)都对于一个消息处理函数,windows对消息处理函数的原型是有要求的必须是回调函数,
//即系统会根据消息列表里
//取出来的消息寻找对于的消息处理函数的入口来调用消息处理函数,在windows的应用程序中将系统消息以及用户定义的消息存储在一个巨大消息链表(双向链表),树
//枝状,在基类和派生类的消息中
//情况更复杂一些,涉及到如何判断当前消息时继承是在主干部还是在枝节部。但是这些在glut里面都隐藏了,所需要做的就是注册消息函数,根据消息处理函数原型编写
//消息处理函数
//进入大循环
glutDisplayFunc(ReDraw);
glutTimerFunc(20,Timer0,0);
glutMainLoop();
}
void ReDraw(void)
{
glClearColor(0.0,0.0,0.0,0.0);
glClear(GL_COLOR_BUFFER_BIT);
glFlush();
}
//用到定时器,和mfc中的定时器几乎一样,根据id来区分不同定时器,如果应用中使用多个定时器的话,需要分别注册,然后在定时器处理函数中根据入口参数id的
//不同可以用一个大的case语句来分情况判断是哪个定时器触发。
void Timer0(int id)
{
//set the background to black
glLineWidth(GetRand(1,10));
glColor3f(0,GetRand(0,1),0);
float y = GetRand(0,ScreenHeight);
glBegin(GL_LINES);
glVertex2f(0.0f,y);
glVertex2f(ScreenWidth,y);
glEnd();
float x = GetRand(0,ScreenWidth);
glBegin(GL_LINES);
glVertex2f(x,0);
glVertex2f(x,ScreenHeight);
glEnd();
glFlush();
glutTimerFunc(int(GetRand(20,100)),Timer0,0);//for continue timer counting
}
////////////////////GetRand////////////////////
float GetRand(int start,int end)
{
return start + (end - start)*rand()/(RAND_MAX + 1.0);
}
OpenGL学习笔记1——第一个程序的更多相关文章
- DirectX11 学习笔记1 - 第一个程序
为了加快学习速度,和使程序更加easy理解. 我把sampler tutorial里面的一个样例 的固定代码和常常修改的代码经过简单的类的封装了一下. 以后学习的时候就能够仅仅在还有一个文件写ren ...
- OpenGL学习笔记3——缓冲区对象
在GL中特别提出了缓冲区对象这一概念,是针对提高绘图效率的一个手段.由于GL的架构是基于客户——服务器模型建立的,因此默认所有的绘图数据均是存储在本地客户端,通过GL内核渲染处理以后再将数据发往GPU ...
- OpenGL学习笔记:拾取与选择
转自:OpenGL学习笔记:拾取与选择 在开发OpenGL程序时,一个重要的问题就是互动,假设一个场景里面有很多元素,当用鼠标点击不同元素时,期待作出不同的反应,那么在OpenGL里面,是怎么知道我当 ...
- Lua学习笔记4. coroutine协同程序和文件I/O、错误处理
Lua学习笔记4. coroutine协同程序和文件I/O.错误处理 coroutine Lua 的协同程序coroutine和线程比较类似,有独立的堆栈.局部变量.独立的指针指令,同时又能共享全局变 ...
- Linux进程线程学习笔记:运行新程序
Linux进程线程学习笔记:运行新程序 周银辉 在上一篇中我们说到,当启动一个新进程以后,新进程会复制父进程的大部份上下 ...
- Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第一章:向量代数
原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第一章:向量代数 学习目标: 学习如何使用几何学和数字描述 Vecto ...
- Stealth视频教程学习笔记(第一章)
Stealth视频教程学习笔记(第一章) 本文是对Unity官方视频教程Stealth的学习笔记.在此之前,本人整理了Stealth视频的英文字幕,并放到了优酷上.本文将分别对各个视频进行学习总结,提 ...
- 20145330《Java学习笔记》第一章课后练习8知识总结以及IDEA初次尝试
20145330<Java学习笔记>第一章课后练习8知识总结以及IDEA初次尝试 题目: 如果C:\workspace\Hello\src中有Main.java如下: package cc ...
- 微信小程序开发:学习笔记[7]——理解小程序的宿主环境
微信小程序开发:学习笔记[7]——理解小程序的宿主环境 渲染层与逻辑层 小程序的运行环境分成渲染层和逻辑层. 程序构造器
随机推荐
- 防止sql注入
sqlmap 较专业的sql注入工具YII2 activeform 注意传过来的modle的rules规则 <?php$form=\yii\widgets\ActiveForm::begi ...
- html EVENT对象
Event 对象 Event 对象代表事件的状态,比如事件在其中发生的元素.键盘按键的状态.鼠标的位置.鼠标按钮的状态. 事件通常与函数结合使用,函数不会在事件发生前被执行! onabort 图像的加 ...
- WinZip Registry Optimizer 初体验
WinZip Registry Optimizer是来自著名压缩软件WinZip开发团队的一种可以修复.组织和整理Windows注册表的应用程序,它可以删除无效的注册表条目,整理碎片从而提升系统性能, ...
- Object.create() 和 __proto__ 的关系
经测试得出 Ojbect.create() 也就是通过修改 __proto__ 实现的. 例: var Super = { say: function() {console.log('say')} } ...
- tomcat7 启动项目报错 java.lang.NoSuchMethodError: javax.servlet.ServletContext.getSessionCookieConfig()
JDK版本:jdk1.8.0_77 Tomcat 版本:apache-tomcat-7.0.47 异常重现步骤: 1.完成项目部署 2.启动Tomcat 异常头部信息:java.lang.NoSuch ...
- comboBox 手动输入后回车自动更新数据
C# Winform ComboBox 在输入内容时 会在下拉菜单中显示 根据输入内容查询的结果 2014-01-02 16:42匿名 | 浏览 713 次 C# ComboBox 在输入内容时 会在 ...
- powerdesinger
www.sap.com solutions>data management>powerdesinger http://www.sap.com/product/data-mgmt/power ...
- MSER算法介绍
MSER代码编译: matlabroot %如果是VS2010则解压VS2010MEX支持文件到MATLAB根目录 unzip('E:\Software\develop Tools\VS2010MEX ...
- 用SysTick做的延时计时器
CM3.CM4的内核中都有个24位的SysTick定时器.这两个MCU里边的SysTick大同小异.SysTick的介绍可以参考:(来自CSDN博客的参考)或者(来自百度文库的参考)或者参考<C ...
- json对象数组按对象属性排序
var array = [ {name: 'a', phone: 1, value: 'val_4'}, {name: 'b', phone: 5, value: 'val_3'}, {name: ' ...