OpenGL配置及窗口创建过程

  • Post author:
  • Post category:其他



1.软件安装与配置


1.1基础配置



Vs2010 +GLFW(




创建窗体)+GLAD(显卡opengl函数地址访问)


glfw+glad是目前OpenGl项目开发的一种常用组合方式







glfw 官网 example也是这种组合方式。


其中,

GLFW用来创建窗体; GLAD用来获得显卡opengl函数地址


这是因为:

1).OpenGL是渲染2D、3D矢量图形硬件的一种

软件接口

,但

OpenGL


只提供了绘图功能,创建窗口是需要自己完成的

。这就需要学习相应操作系统的创建窗口方法,比较复杂,并且每个操作系统都不同。为简化创建窗口的过程,

可以使用专门的窗口库,例如


GLUT


、GLFW




。由于

GLUT

已经是

90


年代

的东西了(不过

后来还有


freeglut

),而

GLFW


是新的,因此建议使用GLFW



2).


因为




OpenGL




只是一个标准




/




规范,具体的实现是由驱动开发商针对特定显卡实现的。由于




OpenGL




驱动版本众多,它大多数函数的位置都无法在编译时确定下来,需要在运行时查询。所以任务就落在了开发者身上,开发者需要在运行时获取函数地址并将其保存在一个函数指针中供以后使用。取得地址的方法



因平台而异



,以




Windows




为例,非常复杂,而且很繁琐,我们需要对每个可能使用的函数都要重复这个过程。幸运的是,有些库能简化此过程,其中





GLAD





是目前最新,也是最流行的库。



参考网址

各类之间的关系简介


OpenGL之gult/freeglut/glew/glfw/glad的联系与区别_无名小卒000001的博客-CSDN博客_freeglut glfw

OpenGL入门教程

https://blog.csdn.net/xiangzhihong8/article/details/84776943?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165061786516782184628461%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=165061786516782184628461&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-1-84776943.142^v9^pc_search_result_cache,157^v4^control&utm_term=OpenGL&spm=1018.2226.3001.4187

GLFW+GLAD配置

https://learnopengl-cn.github.io/01%20Getting%20started/02%20Creating%20a%20window/#glad


1.2GLFW配置

参考网址

[OpenGL]配置GLFW(超详细):


[OpenGL]配置GLFW(超详细) – collectionne – 博客园

GLFW+GLAD配置:

https://learnopengl-cn.github.io/01%20Getting%20started/02%20Creating%20a%20window/#glad

  1. 使用步骤:库编译+


    IDE


    工程配置

通过库编译,生成适用的库文件:

  1. 官网下载GLFW源码;
  2. Cmake生成VS工程文件;
  3. 打开Cmake生成的工程文件;
  4. 将任一example工程设为为启动项;
  5. 开始编译,编译结束后在build\src\Debug中出现glfw3.lib文件;



库生成完毕之后,我们需要让




IDE




知道库和头文件的位置:



  1. 建立一个新的目录,如




    C:\Program Files (x86)\OpenGl




    ,里面包含





    lib











    Include





    文件夹,用以存放




    OpenGL




    工程用到的所有第三方库和头文件;








  2. GLFW




    的头文件目录




    GLFW









    deps




    拷贝至




    include




    文件中;将




    lib




    文件拷贝至




    lib




    文件夹中;



  3. 设置




    IDE




    的路径和依赖的库文件




    glfwlib

1.3

GLAD配置

参考网址

[OpenGL]配置GLFW(超详细):


[OpenGL]配置GLFW(超详细) – collectionne – 博客园

GLFW+GLAD配置:

https://learnopengl-cn.github.io/01%20Getting%20started/02%20Creating%20a%20window/#glad

使用步骤:源文件获取+


IDE


工程配置



1).


打开


GLAD






在线服务



,将语言


(Language)


设置为



C/C++



,在


API


选项中,选择



3.3



以上的


OpenGL(gl)


版本(我们的教程中将使用


3.3


版本,但更新的版本也能用)。之后将模式


(Profile)


设置为



Core



,并且保证选中了

生成加载器



(Generate a loader)


选项。现在可以先(暂时)忽略扩展


(Extensions)


中的内容。都选择完之后,点击

生成



(Generate)


按钮来生成库文件。



2).GLAD


现在应该提供给你了一个


zip


压缩文件,包含两个头文件目录,和一个



glad.c



文件。将两个头文件目录(



glad







KHR



)复制到你的



Include



文件夹中(或者增加一个额外的项目指向这些目录),并添加



glad.c



文件到你的工程中。



3).


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



#




include




<glad/glad.h>



点击编译按钮应该不会给你提示任何的错误。


经上述配置后,就可以


使用




GLFW









GLAD




来设置




OpenGL




上下文并创建一个窗口。


2.第一个窗口示例

参考网址


你好,窗口 – LearnOpenGL CN

示例释义

/** 1.初始化GLFW**/

glfwInit();

/** 2.配置GLFW **/

/* 告知GLFW,OPENGL版本号 3.3 */

glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);

glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);

/* 告知GLFW,使用的是核心模式*/

//明确告诉GLFW我们需要使用核心模式意味着我们只能使用OpenGL功能的一个子集(没有我们已不再需要的向后兼容特性)

glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);

//glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);

/** 3.创建窗口 **/

/* 函数名:长、宽、名,最后两个参数暂时忽略*/

GLFWwindow* window = glfwCreateWindow(800, 600, “LearnOpenGL”, NULL, NULL);

if (window == NULL)

{

std::cout << “Failed to create GLFW window” << std::endl;

glfwTerminate();

return -1;

}

/** 4.通知GLFW,将所创建的窗口的上下文设置为当前线程的主上下文了**/

glfwMakeContextCurrent(window);

/** 5.GLAD初始化 **/

/*GLAD是用来管理显卡的OpenGL函数指针的,所以在调用任何OpenGL的函数之前需要初始化GLAD*/

if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))

{

std::cout << “Failed to initialize GLAD” << std::endl;

return -1;

}

/** 6.渲染窗口的尺寸大小,即视口(Viewport))设置**/

/*这样OpenGL才知道怎样根据窗口大小显示数据和坐标*/

/*OpenGL幕后使用glViewport中定义的位置和宽高进行2D坐标的转换,将(-1,1)的NDC坐标转为屏幕像素坐标*/

/* 个人理解,其实是为光栅化提供依据*/

glViewport(0, 0, 800, 600);

glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);//窗口大小改变时Viewport设置

/** 7.渲染循环 **/

/* 希望程序在我们主动关闭它之前不断绘制图像并能够接受用户输入 */

/* (1)每次循环开始前检查一次GLFW是否被要求退出 */

while(!glfwWindowShouldClose(window))

{

/* (2)检查有没有触发什么事件(比如键盘输入、鼠标移动等)、更新窗口状态,并调用对应的回调函数(可以通过回调方法手动设置)。*/

glfwSwapBuffers(window);

/* (3)双缓冲交换,使屏幕输出显示,类似于DirectDraw的blt*/

glfwPollEvents();

}

/** 8.渲染结束,释放资源**/

glfwTerminate();



版权声明:本文为MissCoder原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。