OpenGl 学习笔记 01

来源:互联网 发布:python编码汉字互转 编辑:程序博客网 时间:2024/06/02 03:08

使用一个库无非包含三个步骤:

  • 包含头文件
  • 链接库文件
  • 提供运行时dll文件
gl.h是opengl核心库
glu.h是实用库
glut.h是工具集    是第三方库,
代表OpenGL Utility Tookit。Mark J.Kilgard 为了使OpenGL应用程序结构能够真正独立于窗口系统构思了GLUT库。

Freeglut是一个GLUT的开源实现。

glext.h使你可以调用GL的常见扩展函数。
想使用更高版本GL的特性,你必须包含该头文件,并将你的显卡驱动更新到最新版本。
glm是OpenGL Mathematics    C++ mathematics library for graphics software。数学库
gl/glu/glut/gltools等的区别 
好啦,该说说gl.h/glu.h/glut.h/gltools.h的区别啦。
    之前写代码都是这样几行:
    #include<windows.h>
    #include<gl/gl.h>
     #include<gl/glut.h>
    这样写不影响编译问题。为啥没问题?还是自己亲自试下比较好。
    在安装的VC目录VC/include/GL里找到glut.h文件,打开可以看到这两句:
#include<GL/gl.h>
#include<GL/glu.h>
再往下看,就可看到好多像glutInitWindowPosition()这样以glut为首的函数声明。 
    同理,打开gl.h可看到好多以gl为首的函数声明:例如glClear();打开glu.h就可看到好多以glu为首的函数声明。亲眼打开文件看了,我想记忆就要深刻得多了。
    GLU(OpenGL Utility library),叫做OpenGL工具函数库。
    GLUT(OpenGL Utility Toolkit),叫做OpenGL实用工具库。二者叫法易混淆,稍微注意一下即可。
    现在贴上超级宝典里的一段简单代码,再针对代码分析:
#include "stdafx.h"
#include<windows.h>
#include<gl/glut.h>
//#include"gl/superbible/gltools.h"

void RenderScene(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glFlush();
}

void SetupRC(void)
{
glClearColor(0.0,0.0,1.0,1.0);
}
int main(int argc,char *argv[])
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGBA);
glutInitWindowPosition(100,100);
glutInitWindowSize(400,400);
glutCreateWindow("first program");
glutDisplayFunc(RenderScene);
SetupRC();
glutMainLoop();
return 0;
}
    首先要#include<windows.h>,因为gl.h和glu.h里用到了在windows.h里定义的宏定义。
    然后#include<gl/glut.h>,你尝试不要这句,运行一下,错误就会告诉你原因的。
    至于gltools.h,超级宝典第4版P30里说它包含了gl.h和glut.h,其实这里错了,应该是gl.h和glu.h,打开文件看看你就会相信我说的。而且书上程序清单只有#include"gl/superbible/gltools.h",这明显是有问题的,打开gltools.h,里面并没有glutInit()等以glut为首的函数声明。
    好啦,相信你此时对这几个头文件的包含不会再含糊了吧。
  
另:建群期间,许多朋友还是不大明白gltools.h是什么东东。这里再简单说一下。
    《Open个GL超级宝典》里有好多函数是大师为了开发需求自己编写的。gltools.h就是将gl.h、glu.h以及大师自己写的函数包装起来。对于初学者,完全不需要用gltools.h。需要的话,群共享里即可下载。

OpenGL是基于光栅化的系统。
render  渲染
shader  着色器  是图形硬件设备所执行的一类特殊函数。可以理解为转位GPU编写的一类小型程序。
vertex  顶点
pixel   像素  显示器上最小的可见单元
framebuffer  帧缓存  计算机将所有的像素保存到帧缓存中。是由图形硬件设备单独管理的一块内存区域,可以直接映射到显示设备上。
语法
OpenGL库中的所有函数都会以gl开头 采用驼峰命名法。如 glBindVertexArrary() 
所有的常量全大写,空格用下划线表示,以GL_开头。
为了能更好的跨平台,opengl还定义了不同的数据类型。如GLfloat表示浮点数。
opengl是C语言的函数库,不能是用重载,通过函数名的细微变化来区分实现同一功能的一组函数.如glUniform2f()表示传入两个GLfloat型的数据。
使用glUniform*()*表示所有glUniform*()函数的集合。又如2fv的后缀表示要用一个以为的GLfloat类型的数组传入两个浮点数。而不是两个GLfloat类型的数值。
顶点着色器和片元着色器是必须的,细分和几何着色器是可选的。
细分着色会增加集合图元的数量,是模型的外观变得更为平顺。
glutInit()负责初始化GLUT库。他必须是应用程序调用的第一个GLUT函数。
glutInitDisplayMode()设置程序使用的窗口类型。
glutDisplayFunc(display)设置显示回调,即glut在每次更新窗口内容时会自动调用该函数,这里讲display()函数的地址传入。
glutMainLoop()为无限循环。其后的指令不会被执行。
vertex-arrary object 顶点数组对象

0 0