环境准备:本文是基于OpenGL的开发环境搭建完成的情况下,进行一些简单图形的渲染和显示(macOS的OpenGL环境搭建,详情可参考我之前的文章:OpenGL在macOS上的环境搭建)
工具类(着色器管理类、GLTools函数、freeglut静态库)
① 着色器管理类:GLTool 着⾊管理器类(shader Mananger),创建管理着色器,进行基本的渲染(#include
② GLTools函数:包含了大部分GLTool中类似C语⾔的独立函数( #include
③ freeglut静态库:在Windows 和 Linux上,使用freeglut的静态库版本并且需要添加⼀个宏(#include
// 着色器
GLShaderManager shadermanager;
// 批次容器
GLBatch triangleBatch;
int main(int argc, char *argv[]) {
// 设置当前工作目录,针对MAC OS X
gltSetWorkingDirectory(argv[0]);
// 初始化GLUT库
glutInit(&argc, argv);
/* 初始化双缓冲窗口
* GLUT_DOUBLE : 双缓冲窗口
* GLUT_RGBA : RGBA颜色模式
* GLUT_DEPTH : 深度测试
* GLUT_STENCIL : 模板缓冲区
*/
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH | GLUT_STENCIL);
// GLUT窗口大小,标题窗口
glutInitWindowSize(400, 200);
glutCreateWindow("绘制三角形");
// 注册回掉函数
glutReshapeFunc(changeWindowSize);
glutDisplayFunc(renderScene);
// 驱动程序的初始化中没有出现问题,确保API完全正常使用
GLenum statue = glewInit();
if (GLEW_OK != statue) {
fprintf(stderr,"glew error:%s\n",glewGetErrorString(statue));
return 1;
}
// 设置渲染环境
setupRC();
glutMainLoop();
return 0;
}
/// 窗口大小改变时接受新的宽度和高度
/// 触发条件: 1.新建窗口 2.窗⼝尺⼨发生调整
/// 处理理业务: 1.设置OpenGL 视⼝ 2. 设置OpenGL 投影⽅式等
/// @param w 像素
/// @param h 像素
void changeWindowSize(int w, int h) {
glViewport(0, 0, w, h);
}
void setupRC() {
// 设置背景色
glClearColor(0.98f, 0.40f, 0.0f, 1.0f);
// 初始化着色器
shadermanager.InitializeStockShaders();
// 设置三角形顶点,其中数组vVerts包含所有3个顶点的x,y,z笛卡尔坐标对
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();
}
/// 开始渲染(触发条件:1.系统自动触发 2.⼿动调用函数触发)
void renderScene(void) {
// 清除一个或一组特定的缓冲区
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
// 设置一组浮点数来表示颜色
GLfloat colorRed[] = {1.0f, 0.0f, 0.0f, 1.0f};
// 传递到存储着色器,即GLT_SHADER_IDENTITY着色器,这个着色器只是使用指定颜色以默认笛卡尔坐标第在屏幕上渲染几何图形
shadermanager.UseStockShader(GLT_SHADER_IDENTITY, colorRed);
// 提交着色器
triangleBatch.Draw();
// 将在后台缓冲区进行渲染,然后在结束时交换到前台
glutSwapBuffers();
}
#include "GLShaderManager.h"
#include "GLTools.h"
#include
GLShaderManager shadermanager;
GLBatch triangleBatch;
/// 窗口大小改变时接受新的宽度和高度
/// 触发条件: 1.新建窗口 2.窗⼝尺⼨发生调整
/// 处理业务: 1.设置OpenGL 视⼝ 2. 设置OpenGL 投影⽅式等
/// @param w 像素
/// @param h 像素
void changeWindowSize(int w, int h) {
glViewport(0, 0, w, h);
}
void setupRC() {
// 设置背景色
glClearColor(0.98f, 0.40f, 0.0f, 1.0f);
// 初始化着色器
shadermanager.InitializeStockShaders();
// 设置三角形顶点,其中数组vVerts包含所有3个顶点的x,y,z笛卡尔坐标对
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();
}
/// 开始渲染(触发条件:1.系统自动触发 2.⼿动调用函数触发)
void renderScene(void) {
// 清除一个或一组特定的缓冲区
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
// 设置一组浮点数来表示颜色
GLfloat colorRed[] = {1.0f, 0.0f, 0.0f, 1.0f};
// 传递到存储着色器,即GLT_SHADER_IDENTITY着色器,这个着色器只是使用指定颜色以默认笛卡尔坐标第在屏幕上渲染几何图形
shadermanager.UseStockShader(GLT_SHADER_IDENTITY, colorRed);
// 提交着色器
triangleBatch.Draw();
// 将在后台缓冲区进行渲染,然后在结束时交换到前台
glutSwapBuffers();
}
int main(int argc, char *argv[]) {
// 设置当前工作目录,针对MAC OS X
gltSetWorkingDirectory(argv[0]);
// 初始化GLUT库
glutInit(&argc, argv);
/* 初始化双缓冲窗口
* GLUT_DOUBLE : 双缓冲窗口
* GLUT_RGBA : RGBA颜色模式
* GLUT_DEPTH : 深度测试
* GLUT_STENCIL : 模板缓冲区
*/
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH | GLUT_STENCIL);
// GLUT窗口大小,标题窗口
glutInitWindowSize(400, 200);
glutCreateWindow("绘制三角形");
// 注册回掉函数
glutReshapeFunc(changeWindowSize);
glutDisplayFunc(renderScene);
// 驱动程序的初始化中没有出现问题,确保API完全正常使用
GLenum statue = glewInit();
if (GLEW_OK != statue) {
fprintf(stderr,"glew error:%s\n",glewGetErrorString(statue));
return 1;
}
// 设置渲染环境
setupRC();
glutMainLoop();
return 0;
}