一、准備工作
創建Empty Project,為了能夠使用OpenGL的庫函數,需要把相關的庫連接到項目中:
1、首先添加庫的路徑
如上,可以把需要添加的include、lib放到一起比較方便管理
這時候,VS就能找到所有需要的文件了。
2、然后把相關庫鏈接到項目中,
注:GLFW是一個C寫的專門用於OpenGL開發的庫,它只提供把物體渲染到屏幕所需的必要功能。它可以給我們創建一個
OpenGL環境,定義窗口參數,以及相應用戶輸入,這些都是必要的功能。
本節使用GLFW,但是鏈接的時候除了GLFW,把OpenGL庫也添加上了,這里,OpenGL庫的添加是和
操作系統有關的。
本文使用的是windows,Microsoft SDK提供了一個opengl32.lib,是vs自帶的,所以我們這里鏈接的是opengl32.lib。
另外,對於不同版本的OpenGL,管理各個版本之間函數調用,通過GLEW這個庫實現,也需要添加這個的鏈接。
如果你使用GLEW的靜態庫,我們必須在包含GLEW之前定義一個預處理變量GLEW_STATIC。
#DEFINE GLEW_STATIC #include <GL/glew.h>
至此,我們的准備工作已經完成。
---------------
glfw是輔助創建openGL窗口的開源庫.所以在后面配置工程的時候你會發現我們根本就不需要用到MFC窗口框架的,只需要console工程即可
glew是暴露openGL的通用API的開源庫,
glm是openGL開發中常用的數學庫,主要是一些矩陣變化. 但是該庫里面的源文件都是以.hpp這種不用編譯的后綴形式存在,所以只要include就行,在此環境配置中不用理會.
---------------
二、openGL操作過程
1、初始化、配置GLFW
2、初始化、配置GLEW
3、設置窗口維度
4、消息循環、渲染
5、釋放資源
相應例子代碼:
// GLEW
#define GLEW_STATIC
#include <GL/glew.h>
// GLFW
#include <GLFW/glfw3.h>
#include<iostream>
//Function prototypes
void key_callback(GLFWwindow* window, int key, int scancode, int action, int mode);
// Window dimensions
const GLuint WIDTH = 800, HEIGHT = 600;
// The MAIN function, from here we start the application and run the game loop
int main()
{
std::cout << "Starting GLFW context, OpenGL 3.3" << std::endl;
// 初始化GLFW
glfwInit();
// 配置 GLFW
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);
// 創建 GLFW 窗口
GLFWwindow* window = glfwCreateWindow(WIDTH, HEIGHT, "LearnOpenGL", nullptr, nullptr);
if (window == nullptr)
{
std::cout << "Failed to create GLFW window" << std::endl;
glfwTerminate();
return -1;
}
//通知GLFW將我們窗口的上下文設置為當前線程的主上下文
glfwMakeContextCurrent(window);
// 為窗口設置回調函數(事件響應)
glfwSetKeyCallback(window, key_callback);
// 讓GLEW在管理OpenGL的函數指針時更多地使用現代化的技術
glewExperimental = GL_TRUE;
// 初始化GLEW
if (glewInit() != GLEW_OK)
{
std::cout << "Failed to initialize GLEW" << std::endl;
return -1;
}
//設置窗口的維度,即告訴OpenGL渲染窗口的尺寸大小
//我們實際上也可以將視口的維度設置為比GLFW的維度小,
//這樣子之后所有的OpenGL渲染將會在一個更小的窗口中顯示,
//這樣子的話我們也可以將一些其它元素顯示在OpenGL視口之外。
int width, height;
glfwGetFramebufferSize(window, &width, &height);
glViewport(0, 0, width, height);
// 游戲循環
while (!glfwWindowShouldClose(window))
{
//檢查有沒有觸發什么事件(比如鍵盤輸入、鼠標移動等),然后調用對應的回調函數
glfwPollEvents();
// Render
// Clear the colorbuffer
glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
// 交換顏色緩沖
glfwSwapBuffers(window);
}
// 釋放/刪除之前的分配的所有資源
glfwTerminate();
return 0;
}
// Is called whenever a key is pressed/released via GLFW
void key_callback(GLFWwindow* window, int key, int scancode, int action, int mode)
{
std::cout << key << std::endl;
if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS)
glfwSetWindowShouldClose(window, GL_TRUE);
}
