学习的参考书基本是按照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——第一个程序的更多相关文章

  1. DirectX11 学习笔记1 - 第一个程序

    为了加快学习速度,和使程序更加easy理解.  我把sampler tutorial里面的一个样例 的固定代码和常常修改的代码经过简单的类的封装了一下. 以后学习的时候就能够仅仅在还有一个文件写ren ...

  2. OpenGL学习笔记3——缓冲区对象

    在GL中特别提出了缓冲区对象这一概念,是针对提高绘图效率的一个手段.由于GL的架构是基于客户——服务器模型建立的,因此默认所有的绘图数据均是存储在本地客户端,通过GL内核渲染处理以后再将数据发往GPU ...

  3. OpenGL学习笔记:拾取与选择

    转自:OpenGL学习笔记:拾取与选择 在开发OpenGL程序时,一个重要的问题就是互动,假设一个场景里面有很多元素,当用鼠标点击不同元素时,期待作出不同的反应,那么在OpenGL里面,是怎么知道我当 ...

  4. Lua学习笔记4. coroutine协同程序和文件I/O、错误处理

    Lua学习笔记4. coroutine协同程序和文件I/O.错误处理 coroutine Lua 的协同程序coroutine和线程比较类似,有独立的堆栈.局部变量.独立的指针指令,同时又能共享全局变 ...

  5. Linux进程线程学习笔记:运行新程序

    Linux进程线程学习笔记:运行新程序                                         周银辉 在上一篇中我们说到,当启动一个新进程以后,新进程会复制父进程的大部份上下 ...

  6. Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第一章:向量代数

    原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第一章:向量代数 学习目标: 学习如何使用几何学和数字描述 Vecto ...

  7. Stealth视频教程学习笔记(第一章)

    Stealth视频教程学习笔记(第一章) 本文是对Unity官方视频教程Stealth的学习笔记.在此之前,本人整理了Stealth视频的英文字幕,并放到了优酷上.本文将分别对各个视频进行学习总结,提 ...

  8. 20145330《Java学习笔记》第一章课后练习8知识总结以及IDEA初次尝试

    20145330<Java学习笔记>第一章课后练习8知识总结以及IDEA初次尝试 题目: 如果C:\workspace\Hello\src中有Main.java如下: package cc ...

  9. 微信小程序开发:学习笔记[7]——理解小程序的宿主环境

    微信小程序开发:学习笔记[7]——理解小程序的宿主环境 渲染层与逻辑层 小程序的运行环境分成渲染层和逻辑层. 程序构造器

随机推荐

  1. Express4.x常用API(一):res

    最近在学习NodeJS,用到了express,看着官网上的API手册,打算把其中比较常用到的API根据自己理解翻译一下,方便自己学习使用. 该篇打算用来记录下express中res. 由于水平有限,希 ...

  2. oracle 报警日志详解

    oracle报警日志是一个非常重要的日志,其有两种实现方法: 1.通过全局表来实现,这种方法有一种缺点,就是在关闭数据库后或者数据库宕机后就不能在使用了 2.通过外部表来实现,这种方法避免了方法一种的 ...

  3. android Handler.btionMessage()与Message.obtain()的区别

    类概述 定义一个包含任意类型的描述数据对象,此对象可以发送给Handler.对象包含两个额外的int字段和一个额外的对象字段,这样可以使得在很多情况下不用做分配工作. 尽管Message的构造器是公开 ...

  4. js 浏览器兼容的一些方法

    使用js是一件令人很抓狂的事情,很多的浏览器兼容,一大推的代码,谁的脑袋能记住那么多的东西,只有平时多积累,所谓熟能生巧嘛..这里列出一些常用的兼容代码,一点点积累哈~~~     一.以跨浏览器的方 ...

  5. Java中避免表单重复提交

    表单的重复提交: 没有完整的进行一次,先请求表单页面->再提交表单过程而完成数据提交 造成的根本原因: 没有完整的进行一次,先请求表单页面->再提交表单过程. 造成重复提交的现象: 由于服 ...

  6. 10天学会phpWeChat——第二天:hello world!我的第一个功能模块

    今天我们开始进入<10天学会phpWeChat>系列教程的第二天:创建我的第一个hello world! 功能模块. 1.登录后台,进入 系统设置--自定义模块,如图: 自定义模块参数说明 ...

  7. Entity Framework 摘记

    1.设置隔离级别 var transactionOptions = new System.Transactions.TransactionOptions(); transactionOptions.I ...

  8. Centos7 修改ssh 默认端口号

    第一步.修改/etc/ssh/sshd_config #Port 22 //这行去掉#号 Port 3600 //将端口号改成3600 第二步:在使用SELinux的系统中,需要修改SELinux 使 ...

  9. photoshop,黑白转彩色单色

    方法一: 打开 色相/饱和度 面板,勾选上 着色, 然后调节 明度 滑块. 方法二: 前面方法的缺点是会将修改直接塌陷到图层,如果想不塌陷,可以使用色相蒙板: 同样勾选 着色

  10. Window.Open详解

    文章来源:http://www.cnblogs.com/stswordman/archive/2006/06/02/415853.html 一.window.open()支持环境:JavaScript ...