目录
1.下载GLFW
GLFW是一个轻量级的,开源的,跨平台的library。支持OpenGL及OpenGL ES,用来管理窗口,读取输入,处理事件等。
选择64-bit Windows或32-bit Windows
解压
2. 新建工程
打开Visual Studio,新建一个空项目
将glfw-3.3.8.bin.WIN64(或glfw-3.3.8.bin.WIN32)文件夹中的include和一个库文件夹复制到工程文件夹下,我这里库文件夹选择lib-vc2017
将头文件和库复制到工程后,准备配置
右键后选择属性
64位工程如下,链接静态库(32位工程类似),目录以自己实际目录为准
3. 测试GLFW
#include <GLFW/glfw3.h>
int main(void)
{
GLFWwindow* window;
//初始化glfw库
if (!glfwInit()) return -1;
//创建窗口模式窗口及其OpenGL上下文
window = glfwCreateWindow(640, 480, "Hello World", NULL, NULL);
if (!window)
{
glfwTerminate();
return -1;
}
//使窗口的上下文成为当前上下文
glfwMakeContextCurrent(window);
//循环直到用户关闭窗口
while (!glfwWindowShouldClose(window))
{
//在此处渲染
//(下面的渲染方法不是现在opengl渲染方法,这是遗留的旧opengl渲染)
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_TRIANGLES);
glVertex2f(-0.5, -0.5);
glVertex2f(0.0, 0.5);
glVertex2f(0.5, -0.5);
glEnd();
//交换前缓冲区和后缓冲区
glfwSwapBuffers(window);
//轮询并处理事件
glfwPollEvents();
}
//渲染终止并释放错误回调
glfwTerminate();
return 0;
}
运行通过,结果如下图
4. 下载GLEW
不同的显卡公司会发布一些只有自家显卡才支持的扩展函数,你要想用这些函数,不得不去寻找最新的glext.h,有了GLEW扩展库,你就再也不用为找不到函数的接口而烦恼,因为GLEW能自动识别你的平台所支持的全部OpenGL高级扩展函数。也就是说,只要包含一个glew.h头文件,你就能使用gl,glu,glext,wgl,glx的全部函数。
下载链接
GLEW: The OpenGL Extension Wrangler Library (sourceforge.net)
选择64-bit Windows或32-bit Windows
5.配置工程
与上面类似,将下载的include和64位(32位)库剪切到工程目录中
右键后选择属性,将include目录写入附加包含目录
给出链接库目录
添加附加依赖项,链接静态库
注意:链接静态库后,需要在编译预处理宏定义 GLEW_STATIC
同时glew需要在glfw之前包含
#define GLEW_STATIC//GLEW静态库编译预处理
#include <GL/glew.h>
#include <GLFW/glfw3.h>
当然,编译预处理宏定义 GLEW_STATIC也可以这样给
6.测试GLEW
在上面测试代码后,添加了GLEW部分,下面的渲染管线采用默认的
#define GLEW_STATIC//GLEW静态库编译预处理
#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <iostream>
const float vertices_data[6] = {
-0.5, -0.5,
0.0, 0.5,
0.5, -0.5
};
int main(void)
{
GLFWwindow* window;
//![1]初始化glfw库
if (!glfwInit()) return -1;
//![2]创建窗口模式窗口及其OpenGL上下文
window = glfwCreateWindow(640, 480, "Hello World", NULL, NULL);
if (!window)
{
glfwTerminate();//渲染终止并释放错误回调
return -1;
}
//![3]使窗口的上下文成为当前上下文
glfwMakeContextCurrent(window);
//![4]初始化glew,需要首先有上下文环境才能GLEW_OK
if (glewInit() != GLEW_OK) return -1;
std::cout << "GL_VERSION: " << glGetString(GL_VERSION) << std::endl;//版本号
//初始化
glClearColor(0.2f, 0.3f, 0.3f, 1.0f);//设置清除颜色
//glEnable(GL_DEPTH_TEST);//启动深度缓冲区
//创建VAO&VBO对象
unsigned int VAO, VBO;
glGenVertexArrays(1, &VAO);
glGenBuffers(1, &VBO);
//绑定VAO&VBO对象(先绑VAO)
glBindVertexArray(VAO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);//ARRAY数组buffer
//写入显存buffer
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices_data), vertices_data, GL_STATIC_DRAW);//STATIC静态数据存储
//解析数据
glEnableVertexAttribArray(0);//启用0供着色器读取
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 2 * sizeof(float), (void*)0);
//解绑VAO&VBO对象(后放VAO)
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindVertexArray(0);
//![5]循环直到用户关闭窗口
while (!glfwWindowShouldClose(window))
{
//在此处渲染
//清理
glClear(GL_COLOR_BUFFER_BIT);//清除上一帧
//绑定VAO记录的信息
glBindVertexArray(VAO);
//绘制
glDrawArrays(GL_TRIANGLES, 0, 3);//以每三个顶点绘制一个三角形
//交换前后缓冲并轮询处理事件
glfwSwapBuffers(window);
glfwPollEvents();
}
//![6]释放
glfwTerminate();//渲染终止并释放错误回调
return 0;
}
运行通过,结果如下图