文章目录
reference:
learningopengl
视频参考b站
GLFW相关函数操作参考如下;
GLFW 基础操作
本文并没有介绍GLAD,想要下载配置参考:链接
1.什么是openGL
一般它被认为是一个API(Application Programming Interface, 应用程序编程接口),包含了一系列可以操作图形、图像的函数。然而,OpenGL本身并不是一个API,它仅仅是一个由Khronos组织制定并维护的规范(Specification)。
OpenGL Logo
OpenGL规范严格规定了每个函数该如何执行,以及它们的输出值。至于内部具体每个函数是如何实现(Implement)的,将由OpenGL库的开发者自行决定(译注:这里开发者是指编写OpenGL库的人)。因为OpenGL规范并没有规定实现的细节,具体的OpenGL库允许使用不同的实现,只要其功能和结果与规范相匹配(亦即,作为用户不会感受到功能上的差异)
1.1 总结:opengl不是framework,不是library or engine 它只是一个Specification,它规定了API要干什么,但是没有具体实现,实现由显卡制造商完成。它并不开源(显卡制造商会好心开放源码?),不要被open误导。
1.2 牛在何处 (跨平台? >directX)
注意跨平台看似nb,实际上它的代码会劣于专门平台的api如directx(毕竟亲爸爸为儿子开发)
1.3 为什么学习
vulcan还很原始不稳定,openGL是你最容易学习的图像驱动,因为跨平台,也适合你将成果分享给各个平台,对于学生党而言,你一般没有资源去专门开发另一平台版本。
2.let’s start
2.1 Creating a window
2.11 首先下载GLFW库
windows下请下载32位,64位会有奇怪的问题,方便起见直接下win32,源码版本你还需要编译才能使用。
2.2 example(GLFW官网示例代码,建议手打)
#include <GLFW/glfw3.h>
int main(void)
{
GLFWwindow* window; /*建立窗口实例*/
/* Initialize the library */
if (!glfwInit())
return -1;
/* Create a windowed mode window and its OpenGL context */
window = glfwCreateWindow(640, 480, "Hello World", NULL, NULL);
if (!window)
{
glfwTerminate();
return -1;
}
/* Make the window's context current */
glfwMakeContextCurrent(window);
/* Loop until the user closes the window */
while (!glfwWindowShouldClose(window))
{
/* Render here */
glClear(GL_COLOR_BUFFER_BIT);
/* Swap front and back buffers */
glfwSwapBuffers(window);
/* Poll for and process events */
glfwPollEvents();
}
glfwTerminate();
return 0;
}
当然会报错,你还没导入库
2.2.2 GLFW配置
项目目录下新建一个Dependencies文件
我们需要如下两个文件
删除lib文件中的dill,我们不需要它
将GLWF文件放在Dependencies文件夹里
调整项目属性平台设为win32
应用设置后报错消失
Linker配置类似如图
上述操作使得我们链接到了glfw3.lib
2.3 build
学会用百度搜索相关错误
查找添加相关库后如图
生成成功!
ps:这是b站视频为了展示linker步骤,实际不需要修改附加依赖项,原本默认基本全有
2.4 修改代码画个三角
#include<glad/glad.h> //必须放在最前面 它已经包含正确的OpenGL文件 放后面会导致重复定义
#include <GLFW/glfw3.h>
int main(void)
{
GLFWwindow* window;
/* Initialize the library */
if (!glfwInit())
return -1;
/* Create a windowed mode window and its OpenGL context */
window = glfwCreateWindow(640, 480, "Hello World", NULL, NULL);
if (!window)
{
glfwTerminate();
return -1;
}
/* Make the window's context current */
glfwMakeContextCurrent(window);
/* Loop until the user closes the window */
while (!glfwWindowShouldClose(window))
{
/* Render here */
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_TRIANGLES); /*画个三角*/
glVertex2f(-0.5f, -0.5f); /*顶点位置*/
glVertex2f(0.0f, 0.5f);
glVertex2f(0.5f, -0.5f);
glEnd();
/* Swap front and back buffers */
glfwSwapBuffers(window);
/* Poll for and process events */
glfwPollEvents();
}
glfwTerminate();
return 0;
}