学习的参考书基本是按照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. java hook

    linux下 hook的触发,需要 发送信号为15. 后续补充具体内容.

  2. Rxjava的基本使用

    gradle配置: compile 'io.reactivex:rxjava:1.0.9' 观察者: Observer<String> observer = new Observer< ...

  3. fine-grained

    鸟类图像分类,CUB-200-2011,可以适用于图片左右的调整.

  4. JS与Struts标签page

    <html> <html:link name="map"  page="/xxx/xxx/xxx_delete_do.do"         ...

  5. 收藏:Linux系统信息查看命令大全

    系统# uname -a               # 查看内核/操作系统/CPU信息# head -n 1 /etc/issue   # 查看操作系统版本# cat /proc/cpuinfo  ...

  6. 为什么js加事件时不要写括号

    function al(){alert("我擦")}此时,al代表这个函数的对象,al()就是直接运行了.var nfun=al;就是让nfun也指向了al,此时nfun()就相当 ...

  7. 强制span不换行

    对于上一篇提到的overflow的问题我好像搞懂一些了.事情大概是这个样子的:如果用了float属性,那么元素就会脱离文本的束缚,无法无天起来,这肯定是猿类无法忍受的.要想让他们乖乖就范,要么用清除浮 ...

  8. java中的集合类(Collection)中的Set

    set集合不包含重复元素及与我们无关的排序!我说hibernate实体类中的集合都用Set呢,难道是因为这个?

  9. .split()函数使用方法

    split说明 split():拆分字符串.通过指定分隔符对字符串进行切片,并返回分割后的字符串列表(list) split语法 str.split('type',num)[n] 整个语法的意思是:以 ...

  10. linux 几个控制流语句的格式例子(if语句)

    linux 几个控制流语句的格式例子:if 语句例子:#!/bin/sh a=10b=20 if [ $a == $b ]then echo "a is equal to b"el ...