今天开始学习OpenGL了,记录一下学习过程与知识总结。开始吧!
这个教程使用的是GLFW与GLAD,教程地址是https://learnopengl-cn.github.io/。关于openGL环境的配置在这里就不多说了,直接开始代码的内容吧。
首先,因为使用的是GLFW,刚开始自然是对GLFW进行一个初始化。
1 glfwInit(); 2 glfwWindowHint(GLFW_VERSION_MAJOR, 3); 3 glfwWindowHint(GLFW_VERSION_MINOR, 3); 4 glfwWindowHint(GLFW_OPENGL_ANY_PROFILE, GLFW_OPENGL_CORE_PROFILE);
其中第一行对于GLFW进行了初始化,随后三行对于GLFW做了相关的配置。2、3行指明版本,第4行则是告诉GLFW,我们要使用openGL的“核心模式”(Core-profile)。
接下来我们创建一个窗体实例,并把窗口设置为当前线程的上下文(context):
GLFWwindow *window = glfwCreateWindow(800, 600, "Texture", NULL, NULL);
if (!window)
{
std::cout << "Failed to init window" << std::endl;
return -1;
}
glfwMakeContextCurrent(window);
这样我们就可以在这个窗口上进行一些绘制。
然而,在正式调用openGL的函数之前,我们还需要做一些工作。
因为openGL是由显卡厂商提供的,我们需要加载系统相关的OpenGL函数指针地址,这时就要用到glad了。
if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
{
std::cout << "failed to init glad" << std::endl;
return -1;
}
glfwGetProcAddress会根据我们编译的系统定义正确的函数。
至此,准备工作就做完了。
接下来,让我们设置一下视口(vireport),用于显示东西。
可以简单的用glViewport函数完成
void frameSize(GLFWwindow* window, int width, int height)
{
glViewport(0, 0, width, height);
}
因为要根据窗口的大小来改变视口的大小,因此将它写成一个函数。之后通过
glfwSetFramebufferSizeCallback(window, frameSize);
设置为回调函数,这样,在改变窗口大小的时候,frameSize函数会自动被系统调用,自动调整视口的大小。
接下来,我们创建一个render loop
while (!glfwWindowShouldClose(window))
{
processInput(window);
glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
// 交换颜色缓冲
glfwSwapBuffers(window);
// 检查有没有触发什么事件(比如键盘输入、鼠标移动等)、更新窗口状态,并调用对应的回调函数(可以通过回调方法手动设置)
glfwPollEvents();
}
这就创建好了一个窗口:

完整代码如下(这里就直接贴教程那边的教程啦2333):
#include <glad/glad.h>
#include <GLFW/glfw3.h>
#include <iostream>
void framebuffer_size_callback(GLFWwindow* window, int width, int height);
void processInput(GLFWwindow *window);
// settings
const unsigned int SCR_WIDTH = 800;
const unsigned int SCR_HEIGHT = 600;
int main()
{
// glfw: initialize and configure
// ------------------------------
glfwInit();
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
#ifdef __APPLE__
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); // uncomment this statement to fix compilation on OS X
#endif
// glfw window creation
// --------------------
GLFWwindow* window = glfwCreateWindow(SCR_WIDTH, SCR_HEIGHT, "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);
// glad: load all OpenGL function pointers
// ---------------------------------------
if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
{
std::cout << "Failed to initialize GLAD" << std::endl;
return -1;
}
// render loop
// -----------
while (!glfwWindowShouldClose(window))
{
// input
// -----
processInput(window);
// render
// ------
glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
// glfw: swap buffers and poll IO events (keys pressed/released, mouse moved etc.)
// -------------------------------------------------------------------------------
glfwSwapBuffers(window);
glfwPollEvents();
}
// glfw: terminate, clearing all previously allocated GLFW resources.
// ------------------------------------------------------------------
glfwTerminate();
return 0;
}
// process all input: query GLFW whether relevant keys are pressed/released this frame and react accordingly
// ---------------------------------------------------------------------------------------------------------
void processInput(GLFWwindow *window)
{
if(glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)
glfwSetWindowShouldClose(window, true);
}
// glfw: whenever the window size changed (by OS or user resize) this callback function executes
// ---------------------------------------------------------------------------------------------
void framebuffer_size_callback(GLFWwindow* window, int width, int height)
{
// make sure the viewport matches the new window dimensions; note that width and
// height will be significantly larger than specified on retina displays.
glViewport(0, 0, width, height);
}
浙公网安备 33010602011771号