最近决定学习一下OpenGL,在学习之前,先把环境搭建好
准备
- ligGLTools.a
- GLTools
资源地址:百度云地址 / 密码:6k9d
环境搭建
1、创建一个macOS的项目
Xcode:Creat a new project/macOS/Application/App
2、导入OpenGL的库文件
删除多余类: AppDelegate、ViewController、mian
创建新的入口C++文件:
main
导入GLUI库和OpenGL库
将libGLTools.a放进项目中
到此环境应该就搭建完成了。在main文件里面写上一个demo:《可以根据方向键移动的正方形》 代码如下:
Demo
//
// main.cpp
// OpenGLStudy
//
// Created by 李灿 on 2021/4/7.
//
#include "GLShaderManager.h"
#include "GLTools.h"
#include <glut/glut.h>
GLBatch triangleBatch;
// 着色器管理器
GLShaderManager shaderManager;
GLfloat blockSize = 0.1f;
GLfloat vVerts[] = {
-blockSize,-blockSize,0.0f,
blockSize,-blockSize,0.0f,
blockSize,blockSize,0.0f,
-blockSize,blockSize,0.0f,
};
//窗口大小改变时接受新的宽度和高度,其中0,0代表窗口中视口的左下角坐标,w,h代表像素
void ChangeSize(int w,int h)
{
glViewport(0,0, w, h);
}
//为程序作一次性的设置
void SetupRC()
{
//设置背影颜色
glClearColor(0.98f,0.40f,0.7f,1.0f);
//初始化着色管理器
shaderManager.InitializeStockShaders();
//批次处理
triangleBatch.Begin(GL_POLYGON,4);
triangleBatch.CopyVertexData3f(vVerts);
triangleBatch.End();
}
//开始渲染
void RenderScene(void)
{
//清除一个或一组特定的缓冲区 颜色缓冲区|深度缓冲区 |模版缓冲区
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT|GL_STENCIL_BUFFER_BIT);
//RGB颜色值数组表示颜色
GLfloat vColor[] = {0.0f,1.0f,0.0f,1.0f};
//传递到存储着色器,即GLT_SHADER_IDENTITY着色器,这个着色器只是使用指定颜色以默认笛卡尔坐标第在屏幕上渲染几何图形
shaderManager.UseStockShader(GLT_SHADER_IDENTITY,vColor);
//提交着色器
triangleBatch.Draw();
//将在后台缓冲区进行渲染,然后在结束时交换到前台
glutSwapBuffers();
}
// 特殊按键处理回调
void specialKeys(int key, int x, int y)
{
GLfloat stepLenth = 0.05f;
// 取D点值作为参照
GLfloat pointX = vVerts[9];
GLfloat pointY = vVerts[10];
// 按键上 下 左 右
if (key == GLUT_KEY_UP)
{
if (pointY + stepLenth < 1) {
pointY += stepLenth;
}
}
else if (key == GLUT_KEY_DOWN)
{
if (pointY - stepLenth > -1 + blockSize*2) {
pointY -= stepLenth;
}
}
else if (key == GLUT_KEY_LEFT)
{
if (pointX - stepLenth > -1) {
pointX -= stepLenth;
}
}
else if (key == GLUT_KEY_RIGHT)
{
if (pointX + stepLenth < 1 - blockSize*2) {
pointX += stepLenth;
}
}
// A、B、C、D点位置
vVerts[0] = pointX;
vVerts[1] = pointY - blockSize*2;
vVerts[3] = pointX + blockSize*2;
vVerts[4] = pointY - blockSize*2;
vVerts[6] = pointX + blockSize*2;
vVerts[7] = pointY;
vVerts[9] = pointX;
vVerts[10] = pointY;
triangleBatch.CopyVertexData3f(vVerts);
glutPostRedisplay();
}
int main(int argc,char* argv[])
{
//设置当前工作目录,针对MAC OS X
gltSetWorkingDirectory(argv[0]);
//初始化GLUT库
glutInit(&argc, argv);
/*初始化双缓冲窗口,其中标志GLUT_DOUBLE、GLUT_RGBA、GLUT_DEPTH、GLUT_STENCIL分别指
双缓冲窗口、RGBA颜色模式、深度测试、模板缓冲区*/
glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA|GLUT_DEPTH|GLUT_STENCIL);
//GLUT窗口大小,标题窗口
glutInitWindowSize(800,600);
glutCreateWindow("Triangle");
//注册回调函数
// 注册屏幕大小改变回调
glutReshapeFunc(ChangeSize);
// 注册绘制回调
glutDisplayFunc(RenderScene);
// 注册特殊按键回调
glutSpecialFunc(specialKeys);
//驱动程序的初始化中没有出现任何问题。
GLenum err = glewInit();
if(GLEW_OK != err) {
fprintf(stderr,"glew error:%s\n",glewGetErrorString(err));
return 1;
}
//调用SetupRC
SetupRC();
glutMainLoop();
return 0;
}