OpenGL是一种用于创建实时3D图像的编程接口。
OpenGL(全写Open Graphics Library “开放的图形程序接口”)是指定义了一个跨编程语言、跨平台的编程接口规格的专业的图形程序接口。它用于三维图像(二维的亦可),是一个功能强大,调用方便的底层图形库。
OpenGL的前身是SGI公司为其图形工作站开发的IRIS GL,为解决其移植性差的缺点OpenGL应运而生。虽然微软的DirectX在家用市场全面领先,但在专业高端绘图领域,OpenGL是不能被取代的主角。Direct3D目前还不能支持高端的图形设备和专业应用, OpenGL在这些领域占据着统治地位。OpenGL因其独立的平台无关的三维图形开发库的特性,在游戏开发高端图形绘制方面深受开发者的喜爱。具体信息大家可以去官网查看OpenGL官网。
1992年7月,SGI公司发布了OpenGL的1.0版本,随后又与微软共同开发了Windows NT版本的OpenGL,从而使一些原来必须在高档图形工作站上运行的大型3D图形处理软件也可以在微机上运用。
1995年OpenGL的1.1版本面市,改进打印机支持,在增强元文件中包含OpenGL的调用,顶点数组的新特性,提高顶点位置、法线、颜色、色彩指数、纹理坐标、多边形边缘标识的传输速度,引入了新的纹理特性等等。
2003年的7月28日,SGI和ARB公布了OpenGL 1.5,包括OpenGL ARB的正式扩展规格绘制语言“OpenGL Shading Language”。新功包括:顶点Buffer Object、Shadow功能、隐蔽查询、非乘方纹理等。
2004年8月,OpenGL2.0版本发布~OpenGL 2.0标准的主要制订者并非原来的SGI,而是逐渐在ARB中占据主动地位的3Dlabs。OpenGL2.0支持OpenGL Shading Language、新的shader扩展特性以及其他多项增强特性。
2008年8月初Khronos工作组在Siggraph 2008大会上宣布了OpenGL 3.0图形接口规范,GLSL1.30 shader语言和其他新增功能将再次对未来开放3D接口发展指明方向。
2009年3月又公布了升级版新规范OpenGL 3.1,OpenGL 3.1在3.0版的基础上对整个API模型体系进行了简化,可大幅提高软件开发效率。
2009年8月Khronos小组发布了OpenGL 3.2,提升了性能表现、改进了视觉质量、提高了几何图形处理速度,而且使Direct3D程序更容易移植为OpenGL。
2010年7月26日发布OpenGL 4.1和OpenGL OpenGL Shading Language 4.10。OpenGL4.1提高视觉密集型应用OpenCL™的互操作性,并继续加速计算剖面为核心的支持和兼容性第一次推出的OpenGL 3.2,使开发人员能够使用一个简化的API或保留向后兼容现有的OpenGL代码,这取决于他们的市场需求。
2011年8月9日在温哥华举行的SIGGRAPH 2011大会上Khronos发布了新的OpenGL 4.2标准细节,对于支持现有硬件的API加入了部分新的支持特性。
经过前辈们的不断完善和更新,如今OpenGL已经更新到了 OpenGL 4.6(2017 - 07 -30)OpenGL Shading Language 4.60(2017 - 07 - 23)。
1.打开Xcode (安装xcode为9.1)->macOS -> Cocoa App
2.添加 OpenGl.framework GLUT.framework系统库。
3.添加include 文件 和 libGLTool.a文件。并在BuildSettings -> Header -> Search -> Paths 中添加.a 文件的路径。
4.删除 AppDelegate.h .m Viewcontroller.h .m main.m文件,这边要替换main函数入口,不然程序运行是从main函数进入然后执行runloop循环交由AppDelegate执行的。所以这一套都得删除,替换成我们要使用的main函数接口。
5.创建替换mian函数,创建c++文件,勾掉.h.
6.copy以下代码在main函数里面。
#include "GLTools.h"
#include
#include "GLShaderManager.h"
GLBatch triangleBatch;
GLShaderManager shaderManager;
/** 窗口大小改变时接受到的新的宽高,0,0为窗口左下角坐标,w,h代表像素 */
void ChangeSize(int w,int h)
{
glViewport(0,0, w, h);
}
/** 为程序作一次性的设置 */
void SetupRC()
{
//设置背影颜色
glClearColor(0.0f,0.0f,1.0f,1.0f);
//初始化着色管理器
shaderManager.InitializeStockShaders();
//设置三角形,其中数组vVert包含所有3个顶点的x,y,笛卡尔坐标对。
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};
//传递到存储着色器,即GLT_SHADER_IDENTITY着色器,这个着色器只是使用指定颜色以默认笛卡尔坐标第在屏幕上渲染几何图形
shaderManager.UseStockShader(GLT_SHADER_IDENTITY,vRed);
//提交着色器
triangleBatch.Draw();
//将在后台缓冲区进行渲染,然后在结束时交换到前台
glutSwapBuffers();
}
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);
//驱动程序的初始化中没有出现任何问题。
GLenum err = glewInit();
if(GLEW_OK != err) {
fprintf(stderr,"glew error:%s\n",glewGetErrorString(err));
return 1;
}
//调用SetupRC
SetupRC();
glutMainLoop();
return 0;
}
7.运行程序出现以下界面就说明你成功了。
以上流程可能会出现一些错误,这边列举本人碰到的一些问题及解决方法。
1.头文件报错
因为是直接把文件拉进来,而文件内默认是以framework形式导入的所以这边要将<>换成“”,可以根据系统提示直接点fix就可以。
2.文件路径报错.a文件找不到。
这边错误原因是BuildSettings -> hearder search path 中引入的路径错误。.a文件要放在工程文件下面,在引入路径种必须有工程名字然后才是.a名字。这边有个很好简书类似错误处理方法的文章推荐给大家点我跳转。以下错误可能是先直接拖进来然后又换了文件位置导致的。
最后附上本人成功Demo一个https://github.com/ClementGu/GJ_OpenGL_ConfigDemo,如需资源可以去OpenGL官网下载。