OpengGL教程(一)---OpenGL环境的配置(GLFW3,GLAD)

本文介绍了如何使用GLFW和GLAD在Linux环境下搭建OpenGL开发环境,并通过一个简单的示例演示了如何渲染一个窗口及其中的矩形。

本教程仅个人学习总结

一切参考资源:都在官网。

1、安装glfw

首先下载glfw : 点击这里

1、下载
2、解压
3、mkdir build && cd build
4、cmake … && make -j4
5、cd …
6、将此目录下的include目录里面的东西全拷到自己工程的include中
7、cd build/src 这个目录下面的静态库(默认编译是静态库) libglfw3.a ,为我们需要的库

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

因为OpenGL只是一个标准/规范,具体的实现是由驱动开发商针对特定显卡实现的。由于OpenGL驱动版本众多,它大多数函数的位置都无法在编译时确定下来,需要在运行时查询。所以任务就落在了开发者身上,开发者需要在运行时获取函数地址并将其保存在一个函数指针中供以后使用

2、安装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文件到你的工程中。

3、OpenGL安装。本站一大堆教程这里就不多说了。

第一个hello world,渲染一个窗体

上文中说到GLFW提供了一系列操作OPENGL的接口,首先第一步即为初始化GLFW环境

#include "glfw3.h"

初始化前我们需要先知道GLFW的版本。

    int major = 0, minor = 0, rev = 0;
    glfwGetVersion(&major, &minor, &rev); //查看GLFW版本号
    std::cout << "GLFW version: " << major << "." << minor << "." << rev << std::endl;

然后我们在初始化GLFW环境

    if (glfwInit() == GLFW_FALSE)
    {
   
   
        std::cout << "Failed to initialize GLFW" << std::endl;
    }
    std::cout << "Success to initialize GLFW" << std::endl;

glfwInit这个函数有如下需要注意的点:

PS1:如果此函数失败,它会在返回前调用glfwTerminate。如果成功,您应该在应用程序退出之前调用glfwTerminate。
PS2:此函数只能从主线程调用。

我们还需要告诉GLFW我们使用的openGL版本和模式

    //教程都是基于OpenGL 3.3版本展开讨论的,所以我们需要告诉GLFW我们要使用的OpenGL版本是3.3
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4);                 //主板本号
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 5);                 //次
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); //核心模式

具体设置GLFW的约束条件,我也没整明白~,目前就这么用。1、版本号,2、使用的openGL模式。

接下来就是创建窗口

    GLFWwindow *window = glfwCreateWindow(800, 600, "HelloWorld", NULL, NULL);//倒数第二个参数是选择的监视器模式
    //最后一个参数,基本用不到。
    if (window == NULL)
    {
   
   
        std::cout << "Failed to create GLFW window" << std::endl;
        glfwTerminate();
        return -1;
    }

注意创建失败的话,需要清除所有窗体。glfwTerminate此函数会销毁所有剩余的窗口和光标

接下来我们要设置窗体的归属,简单来说就是设置窗体为那个线程锁持有。

glfwMakeContextCurrent(window);  

一个窗体,大小肯定是可变的。我们可以通过鼠标去拉伸和缩放,这样窗体的大小就是可变的。因此我们要设置一个回调函数
实时设置我们手动改变窗体的大小。

void set_render_size(GLFWwindow *window, int width, int height);

glfwSetFramebufferSizeCallback(window, set_render_size); //注册这个函数,告诉GLFW我们希望每当窗口调整大小的时候调用这个函数

void set_render_size(GLFWwindow *window, int width, int height)
{
   
   
    std::cout<< width<<" "<< height<<std::endl;
    glViewport(0, 0, width, height);
}

下面就是要我们使用openGL来渲染这个窗体,这就要用到GLAD

再次说明一下GLAD的作用便于理解。

到这里还没有结束,我们仍然还有一件事要做。因为OpenGL只是一个标准/规范,具体的实现是由驱动开发商针对特定显卡实现的。由于OpenGL驱动版本众多,它大多数函数的位置都无法在编译时确定下来,需要在运行时查询。所以任务就落在了开发者身上,开发者需要在运行时获取函数地址并将其保存在一个函数指针中供以后使用。

初始化GLAD库:常用接口如下:
int gladLoadGLLoader(GLADloadproc load):任何的OpenGL接口调用都必须在初始化GLAD库后才可以正常访问。如果成功的话,该接口将返回GL_TRUE,否则就会返回GL_FALSE。
其中GLADloadproc函数声明如下:
void* (*GLADloadproc)(const char* name)


GLFWglproc glfwGetProcAddress	(	const char * 	procname	)	
如果当前上下文支持,此函数返回指定 OpenGL 或 OpenGL ES核心或扩展函数的地址。
上下文必须在调用线程上是当前的。在没有当前上下文的情况下调用此函数将导致GLFW_NO_CURRENT_CONTEXT错误。
    //初始化GLAD
    if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
    {
   
   
        std::cout << "Failed to initialize GLAD" << std::endl;
        return -1;
    }

    const GLubyte *OpenGLVersion = glGetString(GL_VERSION); //返回当前OpenGL实现的版本号
    printf("OpenGL实现的版本号:%s\n", OpenGLVersion);
我们不希望只绘制一个图像之后我们的应用程序就立即退出并关闭窗口。
我们希望程序在我们主动关闭它之前不断绘制图像并能够接受用户输入。
因此,我们需要在程序中添加一个while循环,我们可以把它称之为渲染循环(Render Loop),
它能在我们让GLFW退出前一直保持运行。下面几行的代码就实现了一个简单的渲染循环。
    while (!glfwWindowShouldClose(window)) // glfwWindowShouldClose函数在我们每次循环的开始前检查一次GLFW是否被要求退出,
    {
   
                                         //如果是的话该函数返回true然后渲染循环便结束了,之后为我们就可以关闭应用程序了。
        processInput(window);

        glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
        glClear(GL_COLOR_BUFFER_BIT);

        glfwSwapBuffers(window); //函数会交换颜色缓冲(它是一个储存着GLFW窗口每一个像素颜色值的大缓冲),它在这一迭代中被用来绘制,并且将会作为输出显示在屏幕上
        glfwPollEvents();        //函数检查有没有触发什么事件(比如键盘输入、鼠标移动等)、更新窗口状态,并调用对应的回调函数(可以通过回调方法手动设置)。
    }

最后销毁所有窗体

    //销毁所有窗口
    glfwTerminate();

这样我们渲染一个窗体的大体流程就是这些

完整源码如下

#include <iostream>
#include <cstdio>
#include <sys/unistd.h>

#include "glad.h"
#include "glfw3.h"

void set_render_size(GLFWwindow *window, int width, int height);
void processInput(GLFWwindow *window);
int main()
{
   
   
    int major = 0, minor = 0, rev = 0;
    glfwGetVersion(&major, &minor, &rev);
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值