一:环境配置
第一步:选择一个编译环境 现在Windows系统的主流编译环境有Visual Studio,Broland C++ Builder,Dev-C++等,它们都是支持OpenGL的 。这里我VC++ 6.0作为学习OpenGL的环境。(本来俺是在苹果下工作的,可惜我没自己的苹果电脑) 第二步:安装GLUT工具包 GLUT不是OpenGL所必须的,但它会给我们的学习带来一定的方便,推荐安装。 Windows环境下的GLUT下载地址:(大小约为150k)
http://www.opengl.org/resources/libraries/glut/glutdlls37beta.zip 无法从以上地址下载的话请使用下面的 Windows环境下安装GLUT的步骤
: 1、将下载的压缩包解开,将得到5个文件 2、以我的安装目录为例: (1)“d:/Program
Files/Microsoft Visual Studio/VC98/include/GL文件夹”。把解压得到的glut.h放到这个GL文件夹里。没有
GL文件夹可以自己建一个,一般都有的。 (2)“d:/Program Files/Microsoft Visual Studio/VC98/lib文件
夹”。把解压得到的glut.lib和glut32.lib放到静态函数库所在文件夹,即lib文件夹。 (3)把解压得到的
glut.dll和glut32.dll放到操作系统目录下面的system32文件夹内。(典型的位置为:
C:/Windows/System32)这是非常重要的动态链接库设置! 第三步,创建工程,其步骤如下: (1)创建
一个Win32 Console Application。(以我创建的为例,工程名为simpleGL) (2)链接OpenGL libraries:
在Visual C++中先单击Project,再单击Settings,再找到Link单击,最后在Object/library modules 的最前
面加上opengl32.lib Glut32.lib Glaux.lib glu32.lib 。 (3)单击Project Settings中的C/C++标签,将
Preprocessor definitions 中的_CONSOLE改为__WINDOWS。最后单击OK。
//简单例子 Opengl超级宝典上面的
#include "stdafx.h"
#include <gl/glut.h>
void RenderScene(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glFlush();
}
void SetupRC(void)
{
glClearColor(0.0f,0.0f,1.0f,1.0f);
}
int main(int argc, char* argv[])
{
//单缓冲 RGB模式
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
//创建窗口
glutCreateWindow("Simple");
//显示回调函数 第一次创建 大小改变 移去窗口上的覆盖
glutDisplayFunc(RenderScene);
//初始化 在渲染前面
SetupRC();
//让GLUT框架开始运行 出来操作系统的消息
glutMainLoop();
return 0;
}
二:绘制简单矩形
// GLRect.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <windows.h>
#include <gl/glut.h>
void RenderScene(void)
{
glClear(GL_COLOR_BUFFER_BIT);//清除缓冲
glColor3f(1.0f,0.0f,0.0f); //设置绘制的颜色
glRectf(100.0f,150.0f,150.0f,100.0f);//画一个矩形
glFlush();//清空缓冲队列 一系列的绘图指令
}
void SetupRC(void)
{
glClearColor(0.0f,1.0f,1.0f,1.0f);//设置窗口背景的颜色
}
//窗口改变的回调函数
void ChangeSize(GLsizei w, GLsizei h)
{
if(h==0)
h=1;
glViewport(0,0,w,h);//根据窗口的变化重绘
glMatrixMode(GL_PROJECTION);
glLoadIdentity();//拥有在进行任何矩阵处理前的 “复位” 坐标
if(w<=h)
glOrtho(0.0f,300.0f,0.0f,300.0f*h/w,1.0,-1.0);//正影投射 还不是太明白
else
glOrtho(0.0f,300.0f*w/h,0.0f,300.0f,1.0,-1.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
int main(int argc, char* argv[])
{
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
glutCreateWindow("GLRect");
glutDisplayFunc(RenderScene);
glutReshapeFunc(ChangeSize);
SetupRC();
glutMainLoop();
return 0;
}
三简单动画:
// Bounce.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <windows.h>
#include <gl/glut.h>
GLfloat x1=100.0f;
GLfloat y1=150.0f;
GLsizei rsize=50;
GLfloat xstep=0.2f;
GLfloat ystep=0.2f;
GLfloat windowWidth;
GLfloat windowHeight;
void RenderScene(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0f,0.0f,0.0f);
glRectf(x1,y1,x1+rsize,y1+rsize);
glutSwapBuffers();//这里不再使用 glutFlush,当我们执行缓冲区交换时候,其实已经执行了刷新操作
//glFlush();
}
//定时器 Opengl这个定时器只能一次使用,所以写成递归的形式
void TimerFunction(int value)
{
if(x1>windowWidth-rsize||x1<0)
xstep=-xstep;
if(y1>windowHeight-rsize||y1<0)
ystep=-ystep;
if(x1>windowWidth-rsize)
x1=windowWidth-rsize-1;
if(y1>windowHeight-rsize)
y1=windowHeight-rsize-1;
x1+=xstep;
y1+=ystep;
glutPostRedisplay();//重绘
//参数分别是 毫秒数,回调指针,区别值 区分是哪个定时器
glutTimerFunc(33,TimerFunction,1);
}
void SetupRC(void)
{
glClearColor(0.0f,0.0f,1.0f,1.0f);
}
void ChangeSize(GLsizei w, GLsizei h)
{
if(h==0)
h=1;
glViewport(0,0,w,h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
if(w<=h)
{
windowHeight=250.0f*h/w;
windowWidth=250.0f;
}
else
{
windowHeight=250.0f;
windowWidth=250.0f*w/h;
}
glOrtho(0.0f,windowWidth,0.0f,windowHeight,1.0f,-1.0f);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
int main(int argc, char* argv[])
{
// glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB);//双缓冲
glutCreateWindow("Bounce");
glutDisplayFunc(RenderScene);
glutReshapeFunc(ChangeSize);
glutTimerFunc(33,TimerFunction,1);
SetupRC();
glutMainLoop();
//printf("Hello World!/n");
return 0;
}