OpenGL学习笔记(一)

来源:互联网 发布:vb自学教程 编辑:程序博客网 时间:2024/05/29 08:14

忽略关于环境的搭建,网上有很多相关的教程。
我不是很喜欢用VS,所以我实在codeblocks上搭建的环境,主要感觉VS太过臃肿,练习而已,不必太繁琐。

下面是第一个代码,画一个简单的矩形
效果图:
这里写图片描述

#include <windows.h>#include <GL/glut.h>#include <stdlib.h>void Render(void){    glClearColor(0.0,0.0,0.0,0.0);    glClear(GL_COLOR_BUFFER_BIT);    glColor3f(1.0,1.0,1.0);    glOrtho(-50.0,50.0,-50.0,50.0,-1.0,1.0);    glRectf(-25.0,25.0,25.0,-25.0);    glutSwapBuffers();}int main(int argc,char* argv[]){    glutInit(&argc,argv);    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH | GLUT_STENCIL);    glutInitWindowSize(800,600);    glutCreateWindow("first opengl");    glutDisplayFunc(Render);    glutMainLoop();    return 0;}

注意:
在windows平台上需要在包含其他OpenGL头文件之前包含windows.h
这是因为OpenGL有些库当中使用的宏是在windows中定义的。

我们从main函数开始一行行往下说:

1、glutInit(&argc,argv);
对GLUT进行初始化,并处理所有的命令行参数。这个函数需要在调用其他任何GLUT函数前调用。
这个函数远比看上去的复杂,因为对于不同的平台,需要有不同的入口参数。详情可以参考:
详解glutInit

2、glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH | GLUT_STENCIL);

这个函数的功能是设置初始的显示模式,后面可以跟多种模式,并用位或运算符连接

图片来自百度:

图片来自百度

这里说一下一个比较重要的模式,GLUT_DOUBLE:双缓存窗口。我们知道动画其实就是一张图片接着一张图片,那么下一张图片如果直接在屏幕上刷新,如果刷新速度不是很理想的话,我们就能看到刷新的整个过程,从而影响观看的效果。而双缓存的作用在于,我下一张图片先在缓冲区内绘制好,然后和屏幕上的图片互换来达到目的。当然这也会出现很多问题,比如一台刷新速度最快为1/60秒并采用固定帧率的显示器,可以在60fps,30fps,20fps,15fps,12fps等帧率下运行。如果有一个系统,无法在1/60秒内画完一帧中的所有物体,那么帧率就会从60fps下降到30fps。

3、glutInitWindowSize(800,600);
初始化窗口大小,参数的单位为像素。

4、glutCreateWindow(“first opengl”);
创建顶级窗口,参数为窗口的名字。

5、glClearColor(0.0,0.0,0.0,0.0);
函数原型:
void glClearColor(GLclampf red,GLclampf green,GLclampf blue,GLclampf alpha);
前三个参数为RGB,最后一个参数为透明程度

6、glClear(GL_COLOR_BUFFER_BIT);
void glClear(GLbitfield mask);
表示用预先设定的清除值来清除指定的缓冲区
GL_COLOR_BUFFER_BIT
当前可写的颜色缓冲
GL_DEPTH_BUFFER_BIT
深度缓冲
GL_ACCUM_BUFFER_BIT
累积缓冲
GL_STENCIL_BUFFER_BIT
模板缓冲

7、glColor3f(1.0,1.0,1.0);
表示往颜色缓冲区中放入什么颜色,在颜色改变之前,所有的绘制都是使用这个颜色。

8、glOrtho(0.0,1.0,0.0,1.0,-1.0,1.0);
这个函数比较重要需要和glViewport()对照着学习,推荐一个写的很不错的博客:glViewport()函数和glOrtho()函数的理解

9、glRectf(-25.0,25.0,25.0,-25.0);
画矩形,四个参数分别为对角顶点的坐标。

10、glutSwapBuffers();
将前后缓冲区对换

11、glutMainLoop();
进入主循环,调用注册的函数。

推荐两本书,一本是《OpenGL编程指南》(红宝书),还有一本是《OpenGL超级宝典》(蓝宝书)。个人感觉各有千秋,我觉得对照着最好。

原创粉丝点击