搭建环境是学习OpenGL的第一步,对于新手来说是最折磨人,也是最最耗时的一步,会遇到各种错误与困难。我在这一步也是尝试了很多次,失败了很多次。
在这里,推荐大家一个很好的学习OpenGL的网站:LearnOpenGL CN,它的原文是英文的,不过现在已经有了中文版的。
一、OpenGL的特点
1.OpenGL是一个跨语言和跨平台的图形编程接口,这个API用来与GPU交互,实现基于硬件加速的图形渲染。OpenGL实际上是一个抽象的图形渲染规范,尽管可以由软件来完全实现,但它被设计为大部分或者全部由硬件来实现。OpenGL是跨平台的、支持PC端、嵌入式设备、手机设备的渲染;同时也是跨语言的,它底层使用C语言实现,支持java语言、Python、javaScript绑定。
2.状态机
OpenGL自身是一个巨大的状态机(一系列的变量描述OpenGL此刻应当如何运行)。OpenGL的状态机称为OpenGL上下文(Context).我们通常使用如下途径去更改OpenGLzhuangtai :设置选项、操作缓冲。最后,我们使用当前OPenGL上下文来渲染。
三、OpenGL库的介绍
OpenGL有很多扩展库,例如gl、glu、glut、aux、wgl、glfw、glad、glew、freeglut、gltools、sdl、sfml、glx、agl等等根据LearnOpenGL CN学习网站,我们将使用GLAD和GLFW。
1、GLFW
GLFW是一个专门针对OpenGL的C语言库,它提供了一些渲染物体所需的最低限度的窗口。它允许用户创建OpenGL上下文,定义窗口参数以及处理用户输入。
下载地址:GLFW官网
GLFW使用流程:
1)初始化GLFW库;
2)创建一个GLFW窗口以及OpenGL环境;
3)渲染场景;
4)将输出结果呈现给用户
2、GLAD
GLAD是继GL3W、GLEW之后,当前最新的用来访问OpenGL规范接口的第三方库。
下载地址:GLAD下载
打开GLAD在线服务,将语言设置为C/C++,在API选项中,选择3.3以上的OpenGL版本,之后将模式(Profile)设置为Core,并且保证生成加载器,忽略拓展中的内容,点击生成,下载Zip压缩文件。
GLAD使用流程:
1)初始化GLAD库,加载所有OpenGL函数指针。
2)创建着色器并附加到着色器程序。
3)构建缓冲对象并附加到顶点属性
4)使用着色器程序,利用渲染接口将缓冲对象按照指定图元类型渲染出来。
四、环境配置
下载的GLFW库要先进行编译,CMake(下载地址:http://www.cmake.org/cmake/resources/software.html) 是一个工程文件生成工具,用户可以使用预定义好的CMake脚本,根据自己的选择生成不同的IDE的工程文件,可以用它从GLFW源码里创建一个Visual Studio 2015工程文件,之后进行编译。
具体编译过程可以参考OpenGL扩展库基本介绍以及配置
1、建议大家新建一个opengl文件夹,文件夹底下按个人喜好新建子文件夹,我这里建了两个文件夹,分别用来放自己的代码(Code),SDK(库文件),SDK底下包括bin和include
2、把下载并解压后的GLAD的include的两个文件(glad和KHR)放到新建的include;
3、把编译好的GLFW的include底下的GLFW也放进新建的include;
4、根据自己的vs的版本将相应的lib-vc***中的glfw3.dll和glfw3.lib,glfw3dll.lib放进自己新建的文件夹
最后我的include文件中有以下文件(其中GLEW,glm可以忽略)
SDK文件夹底下包括以下内容(同样忽略glew相关内容)
5、然后打开vs,新建一个项目,右键项目名->选择属性->VC++目录->点击包含目录,把自己前面新建的include文件夹添加进去
6.点击库目录,把前面新建的包含.lib和.dll的文件路径加进去(如果你是分为两个文件夹,那么要添加两个),点击“应用”->确定
7、链接器->输入->附加依赖项,在里面加入opengl32.lib,
glfw3.lib,glfw3dll.lib,点击“应用”->确定
在使用glad之前我们要把glad.c添加进我们的项目,接着我们添加一个.cpp文件,用来测试我们的环境配置是否正确。
#include
#include //包含头文件时要确保GLAD头文件是在GLFW的头文件之前。
#include
void framebuffer_size_callback(GLFWwindow* window, int width, int height);
void processInput(GLFWwindow *window);
int main()
{
glfwInit(); //初始化GLFW
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); //主版本号为3
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); //次版本号为3
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); //使用核心模式
//glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); //Mac OS X系统
GLFWwindow* window = glfwCreateWindow(800, 600, "LearnOpenGL", NULL, NULL);
if (window == NULL)
{
std::cout << "Failed to create GLFW window" << std::endl;
glfwTerminate();
return -1;
}
glfwMakeContextCurrent(window);
glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);
if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
{
std::cout << "Failed to initialize GLAD" << std::endl;
return -1;
}
while (!glfwWindowShouldClose(window))
{
processInput(window);
glfwSwapBuffers(window);
glfwPollEvents();
}
glfwTerminate();
return 0;
}
void processInput(GLFWwindow *window)
{
if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)
glfwSetWindowShouldClose(window, true);
}
void framebuffer_size_callback(GLFWwindow* window, int width, int height)
{
glViewport(0, 0, width, height);
}