全部代码流程
具体代码
main.cpp
#include "GLTools.h"
#include "GLShaderManager.h"
#include <glut/glut.h>
GLShaderManager shaderManager;
GLBatch triangleBatch;
GLfloat blockSize = 0.1f;
GLfloat vVerts[] = {
-blockSize, -blockSize, 0.0f,
blockSize, -blockSize, 0.0f,
blockSize, blockSize, 0.0f,
-blockSize, blockSize, 0.0f,
};
GLfloat xPos = 0.0f;
GLfloat yPos = 0.0f;
/// 重塑函数
void changeSize(int w, int h) {
glViewport(0, 0, w, h);
}
/// 渲染函数
void RenderScence(void) {
// 清理要用到的缓冲区
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
// 设置一组浮点数表示红色
GLfloat vRed[] = {1.0f, 0.0f, 0.0f, 1.0f};
// 矩阵
M3DMatrix44f mTransformMatrix;
// 平移矩阵
m3dTranslationMatrix44(mTransformMatrix, xPos, yPos, 0.0f);
// 平面着色器
shaderManager.UseStockShader(GLT_SHADER_FLAT, mTransformMatrix, vRed);
// 开始绘制
triangleBatch.Draw();
// 开始在后台缓冲区进行渲染,然后在结束时交换到前台
glutSwapBuffers();
}
/// 初始化
void setupRC(void) {
// 设置窗口背景色
glClearColor(0.5f, 0.5f, 0.5f, 0.9f);
// 初始化存储着色器
shaderManager.InitializeStockShaders();
// 使用批处理类传递顶点数据
triangleBatch.Begin(GL_TRIANGLE_FAN, 4);
triangleBatch.CopyVertexData3f(vVerts);
triangleBatch.End();
}
/// 特殊事件
void SpecialKeys(int key, int x, int y) {
// 移动(步长)
GLfloat stepSize = 0.05f;
GLfloat blockX = vVerts[0];
GLfloat blockY = vVerts[10];
if (key == GLUT_KEY_UP) {
yPos += stepSize;
}
if (key == GLUT_KEY_DOWN) {
yPos -= stepSize;
}
if (key == GLUT_KEY_LEFT) {
xPos -= stepSize;
}
if (key == GLUT_KEY_RIGHT) {
xPos += stepSize;
}
if (xPos < -1.0f + blockSize) {
xPos = -1.0f + blockSize;
}
if (xPos > 1.0f - blockSize) {
xPos = 1.0f - blockSize;
}
if (yPos > 1.0f - blockSize) {
yPos = 1.0f - blockSize;
}
if (yPos < -1.0f + blockSize) {
yPos = -1.0f + blockSize;
}
// 触发重新渲染
glutPostRedisplay();
}
int main(int argc, char * argv[]) {
// 设置当前工作目录
gltSetWorkingDirectory(argv[0]);
// 初始化 GLUT 库
glutInit(&argc, argv);
// 初始化显示模式: 双缓冲窗口、RGBA颜色模式、深度测试、模版缓冲区
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH | GLUT_STENCIL);
// 设置窗口大小
glutInitWindowSize(800, 600);
// 设置窗口标题
glutCreateWindow("窗口标题");
// 注册重塑函数
glutReshapeFunc(changeSize);
// 注册渲染函数
glutDisplayFunc(RenderScence);
// 注册特殊键位响应
glutSpecialFunc(SpecialKeys);
// 驱动检测
GLenum error = glewInit();
if (GLEW_OK != error) {
fprintf(stderr, "glew error:%@\n", glewGetErrorString(error));
return 1;
}
// 初始化设置
setupRC();
// 开启循环
glutMainLoop();
return 0;
}
需要注意的点
C++ 默认的 main 函数
int main(int argc, char * argv[]){}
Xcode 创建工程默认 main 函数
int main(int argc, const char * argv[]){}
如果把初始化代码写在Xcode默认创建的 main 函数中,由于参数类型不匹配就会编译失败。
! No matching function for call to 'glutInit'