配置环境部分其实还是有点烦,网上资料有很多,耐心点问题也不大。
下面也算是opengl的hello world了,写了比较详细的注释。
值得注意的是#pragma comment(lib,“gltools.lib”)这一行,书中是没有的,可能因为环境配置方法的不同,我必须要手动链接一下gltools库,不然会出现链接错误。
#include <GLTools.h> // OpenGL toolkit
#include <GLShaderManager.h>
#define FREEGLUT_STATIC //在windows和linux上,使用freeglut静态版本,需要添加这一行,否则会出现错误
#include <glut.h>
#pragma comment(lib,"gltools.lib")//要加上这一行链接一下gltools库
GLBatch triangleBatch;//用其来绘制基本图元
GLShaderManager shaderManager;//着色器管理器
void ChangeSize(int w,int h)
{
glViewport(0, 0, w , h);//设置视口大小为窗口大小
}
void SetupRC()
{
glClearColor(0.0f,0.0f,1.0f,1.0f);//设置其背景为蓝色
shaderManager.InitializeStockShaders(); //初始化着色器管理器
GLfloat vVerts[] = { -0.5f , 0.0f , 0.0f,
0.5f , 0.0f , 0.0f,
0.0f , 0.5f , 0.0f };//设置三角形三个顶点的坐标
//建立三角形模型
triangleBatch.Begin(GL_TRIANGLES,3);
triangleBatch.CopyVertexData3f(vVerts);
triangleBatch.End();
}
void RenderScene(void)
{
// 用之前设置好的背景色来填充背景
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);//颜色缓冲区,深度缓冲区,模板缓冲区
GLfloat vRed[] = { 1.0f, 0.0f, 0.0f, 1.0f };//红色
shaderManager.UseStockShader(GLT_SHADER_IDENTITY, vRed);//使用GLTshader和红色填充三角形
triangleBatch.Draw();//绘制三角形
// 交换缓冲,防止闪烁
glutSwapBuffers();
}
int main(int argc, char* argv[])
{
gltSetWorkingDirectory(argv[0]);//设置当前的工作目录,windows环境下也可省略
glutInit(&argc, argv);//传输命令行参数,并初始化glut库
//设置显示模式 双缓冲 RGBA颜色格式 深度缓冲区 模板缓冲区(不大理解,后面可能会讲到这种具体的问题)
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH | GLUT_STENCIL);
glutInitWindowSize(800, 600); //设置窗口的大小
glutCreateWindow("Triangle"); //设置窗口的标题
glutReshapeFunc(ChangeSize); //注册函数,当窗口大小改变的时候设置视点
glutDisplayFunc(RenderScene); //注册渲染场景使用的函数
GLenum err = glewInit(); //初始化glew
if (GLEW_OK != err)
{
fprintf(stderr, "GLEW Error: %s\n", glewGetErrorString(err)); //出现错误然后打印错误
return 1; //return 1代表程序非正常终止
}
SetupRC(); //开始渲染环境
glutMainLoop(); //运行主窗口
return 0;
}