[Day3] 驱动OpenGL

今日目标

  • 安装GLAD
  • 画出第一个三角形

GLAD

还记得以前大学的时候,课堂上使用的是glut,当时很多地方都不清楚,只依稀记得底层是调用OpenGL 1.1的API,也就是固定管线(Fixed Function),简言之,就是不能由开发者自己去编写Shader,控制GPU要怎麽画。可编程管线没记错是在3.0伴随着GLSL 1.0才开始的。

可编程管线的版本的OpenGL,网路上最常看到的是用glew或是glad,虽说最开始用的是glew,但就跟所有C与C++的lib一样,对於初学,会需要一些linker、静态和动态函式库的知识,才可以正常的开始使用,用起来感觉很差,於是选用glad,直接产一个header跟source,直接加入专案就好了,怎麽编译都行!

其实还有另一个原因是,自学一些OpenGL时的教材是使用glad,这个是连结

这个是我找到的简中翻译版本

事实上GLAD不是OpenGL的函式库,比较像是产生器,选择你要的OpenGL规格,然後产出文件。官方github就有提供连结,但我在这里要使用的是更下面的glad2,他会产出***single-header file***,如名,他只会有一个header,不会有另外一份放"实作(implementaion)"的*.c文件。

点进这个连结後:
请在gl那边选OpenGL的版本,我这里用的是GL3.3,最後下面点选header only,最後按下Generate。把.zip下载下来,把gl.h放到专案的exteranl里面,就完成一半了,我是在开一个glad资料夹把gl.h放在里面。

再来就是验证,有没有安装成功了,我们要再次请出glfw的范例。

在Game Loop中一行:

/* Render here */
glClear(GL_COLOR_BUFFER_BIT);

这个是清除这个frame的color buffer,gl开头的就是调用OpenGL的函式,为求方便验证,再加上一行:

// 参数是浮点数,需要将RGBA的色码转换 [RGBA] / 255.0
glClearColor(r, g, b, a);

清除後,会换上新的背景颜色。

对了,就重要的是,要初始化GLAD
可以在iron_window.c的地方加入#include "glad.h",然後在include之前#define GLAD_GL_IMPLEMENTATION,像这样:

#define GLAD_GL_IMPLEMENTATION
#include "glad.h"

然後在CreateWindow那里加上

// Init glad
if (!gladLoadGL(glfwGetProcAddress)) {
    printf("Failed to load glad.");
    return RES_ERROR_LOAD_GLAD;
}

就可以开始使用OpenGL的API了。

这个define是哪来的,各位可以打开gl.h的第4040行,就可以看到single-header file,其实就是把实作放到header里,然後用预处理器的指令把实作跟宣告隔开。

如果对single-header file有更多兴趣的话,可以参考这位大大的github,FAQ那里有更多说明,但是只有英文的。(>~<)

注意: GLFW里面有个坑

然後最後再按下按钮就可以有一个你喜欢颜色的视窗对不对!

错!!

在编译到最後的时候,我的compiler显示引用错误,看来专案其他地方也有实作了OpenGL。

把矛头看相最可疑的glfw,在glfw/deps/glad下找到了,glfw也有引用glad,於是在查找官方文件後(找很久),找到了这一段,可以把glfwglad停用,改用我们自己的,最後在include的地方(一样是iron_window.c)变成这样...

#define GLFW_INCLUDE_NONE
#include "GLFW/glfw3.h"

#define GLAD_GL_IMPLEMENTATION
#include "glad/gl.h"

小目标失败 - 画出第一个三角形

原本今天(2021/09/13)预计要画出第一个三角形,结果卡在GLFW那个坑上面,但这也很贴近程序设计师的的日常工作会发生的事,计画敢不上变化,原本预计花N个小时解决这个问题,结果衍生处更多问题 (QAQ)。

已经有预感会有更多坑惹,不然怎麽叫挑战呢。(ˊ_>ˋ)

参考

最後,这是专案连结


<<:  如何用 Apps Script 寄出客制化的 Google 表单并搜集分散在 Google Sheet 中的回应?(三)一次搜集很多 Google Form 内的回应

>>:  EP01 - 开始建置流程之前

Day21 NiFi - 与 GCP BigQuery 对接设定

今天要来介绍如何透过 NiFi 来与 GCP BigQuery 来做资料整合与操作。 What is...

Day13 Defer

defer A defer statement defers the execution of a ...

[Day 19] 资料产品的管理-资料治理初探

前面花了不少篇幅在讨论资料产品的开发,接下来将花一些篇幅讨论资料产品的治理方式。 在做资料产品治理时...

Day07 iOS15介面的小差别

Hello 大家, 上班了, 厌世的上班日... 继昨天文末说的, iOS的介面不同了, 我稍微的逛...

【Day 21】- 你的爬虫还在用帐号密码进行登入? 带上 Session 吧!(实战 Selenium 自动点击 Instagram 好友贴文赞 1/2)

前情提要 前一篇带各位在 Selenium 中透过执行 JavaScript 语句达到向下卷动的效果...