记录一下看到的知识点。

大部分知识点来自于https://learnopengl-cn.github.io/

1.什么是OpenGL

一般它被认为是一个API,包含了一系列可以操作图形、图像的函数。然而,OpenGL本身并不是一个API,它仅仅是一个由Khronos组织制定并维护的规范。

OpenGL自身是一个巨大的状态机(State Machine):一系列的变量描述OpenGL此刻应当如何运行。OpenGL的状态通常被称为OpenGL上下文(Context)。我们通常使用如下途径去更改OpenGL状态:设置选项,操作缓冲。最后,我们使用当前OpenGL上下文来渲染。

2.在使用OpenGL之前,我们需要配置一些库

(1)GLEW

(2)GLAD:在运行时获取函数地址并将其保存在一个函数指针中供以后使用

(3)GLUT

(4)GLFW:GLFW是一个专门针对OpenGL的C语言库,它提供了一些渲染物体所需的最低限度的接口。它允许用户创建OpenGL上下文,定义窗口参数以及处理用户输入

这些库的配置有很多博主写了,而且也比较详细,这里就不展开描述怎么配置了。

但是要注意会出现的问题:

如何看自己是否配好文件(以这两个为例)

新建一个空文件,添加下面的代码,如果显示未找到,请点击项目——>配置属性——>包含目录里面添加对应的include文件路径;点击链接器——>附加库目录添加.lib文件。注意,这里如果你要用到glad里面的函数,就必须要把glad.c文件导入项目工程里面。

可以用下面的代码测试一下。

#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);
#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);
}

3.双缓冲(Double Buffer)

应用程序使用单缓冲绘图时可能会存在图像闪烁的问题。 这是因为生成的图像不是一下子被绘制出来的,而是按照从左到右,由上而下逐像素地绘制而成的。最终图像不是在瞬间显示给用户,而是通过一步一步生成的,这会导致渲染的结果很不真实。为了规避这些问题,我们应用双缓冲渲染窗口应用程序。前缓冲保存着最终输出的图像,它会在屏幕上显示;而所有的的渲染指令都会在后缓冲上绘制。当所有的渲染指令执行完毕后,我们交换(Swap)前缓冲和后缓冲,这样图像就立即呈显出来,之前提到的不真实感就消除了。

最新文章

  1. java gui 之容器组件
  2. HttpURLConnection 直接发送soap消息调用webservice
  3. andorid jni入门教程一之helloworld
  4. css读书笔记4:字体和文本
  5. Java程序员面试中的多线程问题
  6. SSIS -&gt;&gt; Event Handler
  7. Unity实现相似于安卓原生项目的点击安卓返回button回到前一页的功能
  8. codeforces 676C C. Vasya and String(二分)
  9. Java Json开源解析包 google-gson download(下载)
  10. 两年前实习时的文档——Platform学习总结
  11. CSSOM View Module
  12. linux旁边flv注射MetaData工具
  13. 第三周 数据分析之概要 Pandas库数据特征分析
  14. OrCAD Capture CIS 16.6 将版本16.6的设计文件另存为版本16.2的设计文件
  15. JAVA Freemarker + Word 模板 生成 Word 文档 (普通的变量替换,数据的循环,表格数据的循环,以及图片的东替换)
  16. Linux命令-基本操作和软件安装
  17. httpClient实例--返回响应部分并且转换成对象
  18. .NET中26个优化性能方法
  19. JAVA解压文件
  20. Codeforces 938.D Buy a Ticket

热门文章

  1. 5G工业智能网关助力智能制造开辟新赛道
  2. Python异步爬取梁羽生小说网
  3. 前端之Vue day08 Vue3项目搭建、setup、toRefs
  4. PR如何导出mp4格式的视频
  5. 广告网络归因技术之SKAdNetwork
  6. elasticsearch 排错总结
  7. wsl2 的安装与使用
  8. java基础(一)~~内存分析
  9. ThinkPHP获取当前url
  10. Redis实战(三)Redis冷备如何做