1,OpenGL是什么
OpenGL(全写Open Graphics Library)是个定义了一个跨编程语言、跨平台的编程接口规格的专业的图形程序接口。它用于三维图像(二维的亦可),是一个功能强大,调用方便的底层图形库。
2,OpenGL能做什么
OpenGL能用来开发跨平台的渲染引擎,在Android、OSX、iOS、Windows、PS等平台均可使用 OpenGL(ES)。
3,OpenGL不能做什么
OpenGL不能做物理模拟,OpenGL不能做网络通信,一句话,除了渲染以外的事情,OpenGL都做不了,OpenGL只是一个3D渲染API接口标准。
4,OpenGL VS DirectX
OpenGL和DirectX 相比有以下几点不同:
- OpenGL只能做渲染,DirectX除了渲染以外还能做许多其它的,比如,DirectX 里面包含d3dxmath可以用来做3D数学运算;DirectX里面包含的外部设备接口模块可以用来接受外部设备的输入。
- OpenGL只是一个定义了一些接口的标准,只要实现了这些接口,那么就算是实现了OpenGL,相反的,DirectX则只有微软自己实现的那一份代码,所有人都使用微软给出的那份代码。
- OpenGL能跨平台,几乎所有的平台都支持OpenGL,从移动设备到PC产品再到主机平台,都支持OpenGL,而DirectX则只有微软自己的XBox和Windows支持。
- 速度方面,DirectX完爆OpenGL,对同一硬件而言,DirectX是OpenGL 渲染速度的两倍多。
5,MAC OpenGL环境搭建
我在MAC上使用OpenGL时,使用了如下一些工具和库:Mac Ports、glfw、glew、XCode。
- MacPorts是MAC 平台用来安装第三方库的软件,与 Linux上的apt-install有点像,大家可以从https://www.macports.org/下载
- glfw,OpenGL的扩展程序,因为OpenGL只是一个渲染接口,如果要在具体平台上写OpenGL渲染代码,就要使用 qlfw等库将OpenGL 和本地窗口等环境联系起来,安装glfw只需要使用mac ports即可(sudo port install glfw)。
- glew,与 glfw类似,使用sudo port install glew安装。
- XCode,MAC平台开发唯一的神器,别告诉我在mac你还在用Eclipse写C++。
6,Demo代码
在这里,我只给出一个demo代码,即使用Gourand着色画一个正方形,代码主要包含以下几部分。
/*
* File: Shader.h
* author: 张雄
* date: 2016_02_21
* purpose: 用于定义OpenGL shader操作的接口
*/
#ifndef __ZX_NXENGINE_SHADER_H__
#define __ZX_NXENGINE_SHADER_H__
#include "../common/NXCore.h"
namespace NX {
class Shader{
public:
/*
* <函数功能>
* 构造函数
*
* <函数参数>
* szFilePath: 要使用的shader代码的路径,需要保证的是,仅使用szFilePath,在
* 程序中即可找到shader文件。
* uShaerType: 要使用的shader 代码的shader类型,此类型有GL_VERTEX_SHADER等
* 与OpenGL中使用的值完全相同。
*/
Shader(const char* szFilePath, GLenum uShaderType);
virtual ~Shader();
public:
/*
* <函数功能>
* 编译shader,shader文件和类型由构造函数给出
*/
virtual std::string Compile();
public:
operator GLuint(){
return m_uShaderId;
}
private:
std::string ReadShaderSource();
private:
GLuint m_uShaderId;
GLenum m_uShaderType;
std::string m_strShaderSourceFilePath;
};
}
#endif
#include <fstream>
#include <string>
#include "NXShader.h"
#include "NXLog.h"
NX::Shader::Shader(const char* szFilePath, GLenum uShaderType){
m_strShaderSourceFilePath = (szFilePath);
m_uShaderId = 0;
m_uShaderType = uShaderType;
}
NX::Shader::~Shader(){