LearnOpenGL笔记1基础知识


学习资料:
https://learnopengl-cn.github.io/01%20Getting%20started/01%20OpenGL/
环境:
openGL+GLAD+GLFW+windows

openGL简介

一个对象是一些选项的集合,可以看做结构体。
OpenGL是显卡厂商编写的,所以更新显卡驱动是可以解决bug.
OpenGL驱动版本众多,它大多数函数的位置都无法在编译时确定下来,需要在运行时查询。所以任务就落在了开发者身上,开发者需要在运行时获取函数地址并将其保存在一个函数指针中供以后使用。取得地址的方法因平台而异,GLAD可以简化这个过程!

发展历程

早期是立即渲染模式(固定管线渲染),灵活性差,绘制图形方便,效率低;
3.2版本之后,核心模式更高的灵活性,效率,抽象掉了很多细节,之后的版本没有改变核心架构,所以一般用3.3,新版本的OpenGL需要新一代显卡支持应用程序。

特性:扩展

显卡公司提出新的特性,都是按照扩展方式在驱动中实现,如果一个程序支持在扩展的显卡上运行,就可以获得更有效的图形功能。
状态机:
OpenGL本身就是个状态机,一系列变量描述如何运行,状态被称为上下文(context),状态设置函数会改变上下文。
对象:
OpenGL库是用C语言写的,所以开发时候有一些抽象层,“object”就是其中一个。

GLAD

配置GLAD
GLAD是一个开源的库,它能解决我们上面提到的那个繁琐的问题。GLAD的配置与大多数的开源库有些许的不同,GLAD使用了一个在线服务。在这里我们能够告诉GLAD需要定义的OpenGL版本,并且根据这个版本加载所有相关的OpenGL函数。

打开GLAD的在线服务,将语言(Language)设置为C/C++,在API选项中,选择3.3以上的OpenGL(gl)版本(我们的教程中将使用3.3版本,但更新的版本也能正常工作)。之后将模式(Profile)设置为Core,并且保证生成加载器(Generate a loader)的选项是选中的。现在可以先(暂时)忽略拓展(Extensions)中的内容。都选择完之后,点击生成(Generate)按钮来生成库文件。

GLAD现在应该提供给你了一个zip压缩文件,包含两个头文件目录,和一个glad.c文件。将两个头文件目录(glad和KHR)复制到你的Include文件夹中(或者增加一个额外的项目指向这些目录),并添加glad.c文件到你的工程中。

经过前面的这些步骤之后,你就应该可以将以下的指令加到你的文件顶部了:

#include <glad/glad.h>
点击编译按钮应该不会给你提示任何的错误,到这里我们就已经准备好继续学习下一节去真正使用GLFW和GLAD来设置OpenGL上下文并创建一个窗口了。记得确保你的头文件和库文件的目录设置正确,以及链接器里引用的库文件名正确。

相关英语

主版本号major
此版本号minor
核心模式core-profile
视口viewpoint

视口

渲染窗口大小是“视口”,这样才能知道如何根据窗口大小显示数据和坐标
glViewport设置窗口维度

引擎设置

绘制图像后,主动关闭之前能够一直接受用户输入,所以程序要设置为渲染循环(render loop),
双缓冲(Double Buffer)

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

核心流程

#头文件
定义变量
main(){
初始化参数环境;
创建窗口;
判断窗口环境;
glad加载函数指针
if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
{
std::cout << “Failed to initialize GLAD” << std::endl;
return -1;
}
渲染循环
while (!glfwWindowShouldClose(window))
{
// input
// process all input: query GLFW whether relevant keys are pressed/released this frame and react accordingly
processInput(window);

    // 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;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值