OpenGL学习-基本窗口函数

1.OpenGL窗口

#include <glad/glad.h> 
#include <GLFW/glfw3.h>
//特别注意 glad的include要在其他头文件之前 why?
//GLAD的头文件包含了正确的OpenGL头文件 所以需要在其它依赖于OpenGL的头文件之前包含GLAD

需要引入glad :OpenGL库函数管理的一个扩展
这里一定要注意引入头文件的顺序 

怎么实例化窗口?
这里将glfw的常用函数和用法做了一个汇总 基本上的功能都包含到了

int glfwInit(void);
//初始化GLFW 返回值也是异常为0

void glfwWindowHint(int hint, int value);
//设置GLFW参数
//第一个参数是属性类型 是一个枚举量
//比如 GLFW_CONTEXT_VERSION_MAJOR 表示OpenGL的主版本号
//GLFW_RESIZABLE 表示窗口是否可以调整大小等
//第二个参数是 属性的值
//该函数的所有参数和值都可以在这个网页找到
//https://www.glfw.org/docs/latest/window.html#window_hints 

GLFWwindow* glfwCreateWindow(int width, int height, const char* title, GLFWmonitor* monitor, GLFWwindow* share);
//生成窗口
//需要窗口的宽和高作为它的前两个参数
//第三个参数表示这个窗口的名称(标题)
// GLFWmonitor* monitor, GLFWwindow* share是后面两个参数
//monitor参数用于指定要在其上全屏显示窗口的监视器 如果你不想使用全屏模式,可以将其设置为NULL
//share参数用于指定与新创建的窗口共享OpenGL上下文的其他窗口 可以将其设置为NULL               
               
void glfwTerminate(void);
//清除glfw的使用资源
//注意,一旦调用了 glfwTerminate(),就不能再使用 GLFW 函数   
               
void glfwMakeContextCurrent(GLFWwindow* window);
//将指定的窗口的 OpenGL 上下文设置为当前的上下文 传入一个window指针 修改它上下文               
//在使用 GLFW 创建多个窗口的情况下 需要在每次渲染循环之前设置要渲染的窗口为当前上下文
//说白了 告诉系统现在该渲染哪个窗口

int glfwWindowShouldClose(GLFWwindow* window);
//检查传入窗口的关闭标志是否被设置
//如果被关闭,返回非零 如果没被设置关闭,返回0
//这个函数通常用于在主渲染循环中判断窗口是否应该关闭 放在while判断里

void glfwSwapBuffers(GLFWwindow* window);
//用于交换指定窗口的前后缓冲区 前缓冲区(用于显示)和后缓冲区(用于渲染)
//当渲染完成后,你需要调用 glfwSwapBuffers 来交换这两个缓冲区,使渲染结果显示在屏幕上
//这样可以防止屏幕撕裂(screen tearing)等现象,确保渲染的画面在屏幕上正确显示

void glfwPollEvents(void);
//用于处理窗口事件
//在主渲染循环中,你通常需要定期调用这个函数来检查和处理用户输入事件、窗口事件等

下面是一段简单的代码 利用上述的基本函数实现一个简单的OpenGL窗体

#include <GLFW/glfw3.h>

int main() {
    // 初始化GLFW
    if (!glfwInit()) {
        return -1;
    }

    // 配置GLFW,这里设置OpenGL版本为3.3
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);

    // 创建窗口
    GLFWwindow* window = glfwCreateWindow(800, 600, "OpenGL Window", NULL, NULL);
    if (!window) {
        glfwTerminate();
        return -1;
    }

    // 将窗口的上下文设置为当前上下文
    glfwMakeContextCurrent(window);

    // 主渲染循环
    while (!glfwWindowShouldClose(window)) {
        // 渲染代码放在这里

        // 交换前后缓冲区
        glfwSwapBuffers(window);

        // 处理事件
        glfwPollEvents();
    }

    // 清理资源
    glfwTerminate();
    
    return 0;
}

2.双缓冲- glfwSwapBuffers为什么要加上

在学习这个函数的时候,我们知道glfwSwapBuffer的作用是交换前后缓冲区 前缓冲区(用于显示) 后缓冲区(用于渲染)→防止屏幕撕裂

这个就是 双缓冲的操作

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

原子性交换:一旦渲染完成,通过调用 glfwSwapBuffers 函数,后缓冲区的内容会原子性地(即一次性)交换到前缓冲区。这个过程是原子性的,即要么整个渲染图像被交换,要么不交换,这样用户在任何时候都能看到一个完整的、没有部分渲染的图像

3.glfwPollEvents -事件处理函数

我们在上面学习到:glfwPollEvents函数检查有没有触发什么事件(比如键盘输入、鼠标移动等)、更新窗口状态,并调用对应的回调函数(可以通过回调方法手动设置)

但是可以看到它传入传出参数都是void 那么它是怎么起作用的呢? 怎么设置回调呢?

(1)检查事件队列: GLFW 会在一个事件队列中积累各种事件,例如键盘输入、鼠标输入、窗口大小变化等

(2)处理事件: glfwPollEvents() 会检查事件队列,然后调用相应的事件回调函数或者更新相应的状态。例如,如果有键盘按键被按下,相关的键盘事件回调函数将被调用

(3)清空事件队列: 处理完队列中的所有事件后,事件队列会被清空

这个函数的目的是在主渲染循环中实时地响应用户输入和窗口事件,而不是等待事件发生后再处理。在事件循环中,你会持续不断地调用 glfwPollEvents(),以确保及时地处理来自用户的输入和其他事件

在传入参数和返回值上,glfwPollEvents() 并不需要额外的参数,因为它只是处理 GLFW 窗口和输入系统中的事件,并且这个函数并不返回处理的结果。实际上,它的处理过程是直接影响 GLFW 窗口和输入系统的状态的,而不需要传递或返回额外的数据。因此,其参数和返回值都是 void

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
OpenGL是一个图形硬件的软件接口(“GL”即Graphics Library)。这一接口包含了数百个函数,图形程序员可以利用这些函数指定设计高品质的三维彩色图像所需的对象和操作。这些函数中有许多实际上是其他函数的简单变形,因此,实际上它仅包含大约180个左右完全不同的函数。 OpenGL 实用库(OpenGL Utility Library,GLU)和对X窗口系统的OpenGL扩展(OpenGL Extension to the X Window System,GLX)为OpenGL提供了有用的支持特性和完整的OpenGL核心函数集。本书详细介绍了这些函数的功能。书中各章内容如下: 第1章 OpenGL简介 在概念上对OpenGL作了概述。它通过一个高层的模块图来阐述OpenGL所执行的所有主要处理阶段。 第2章 命令和例程概述 较详细地阐述了OpenGL对输入数据的处理过程(用顶点形式来指定一个几何体或用像素形式来定义一幅图像时),并告诉你如何用OpenGL函数来控制这个过程。此外,在本章中还对GLU和GLX函数作了讨论。 第3章 命令和例程一览 根据OpenGL命令所完成的功能列举说明了这些命令组。一旦了解了这些命令的功能,你就可以利用这些完整的函数原型作为快速参考。 第4章 定义的常量及相关命令 列举了在OpenGL中定义的常量和使用这些常量的命令。 第5章 OpenGL参考说明 本书的主体部分,它包括各组相关的OpenGL命令的描述。带参数的命令和与之一起描述的其他命令仅在数据类型方面有所不同。每个函数的参考说明介绍了参数、命令的作用和使用这些命令时可能发生的错误。 此外,本章还包含了有关OpenGL的 ARB扩展—多重纹理和绘图子集的参考说明。需要说明的是并非所有的OpenGL的环境都支持ARB扩展。 ?第6章 GLU参考说明 本章包含了所有的GLU命令的参考说明。 ?第7章 GLX参考说明 本章包含了所有的GLX命令的参考说明。 0.1 阅读此书前的预备知识 本书是OpenGL Architecture Review Board, Mason Woo、 Jackie Neider、Tom Davis 和Dave Shreinre编著的《OpenGL编程指南(第3版)》(Reading, MA: Addison-Wesley, 1999)的姊妹篇。阅读这两本书的前提是你已经懂得如何用C语言编程。 两本书的不同之处主要在于:《OpenGL编程指南》一书着重于介绍如何运用OpenGL,而本书的重点则是OpenGL的工作方式。当然要想彻底地了解OpenGL,这两方面的知识都是必需的。这两本书的另一个不同点是本书的大多数内容都是按字母次序编排的,这样编排的前提是假定你已经知道你所不明白的地方而仅仅想查找某个特定命令的用法。而《OpenGL编程指南》一书的编排则更像一本指南:它首先解释了OpenGL的简单概念,然后再导出更复杂的概念。虽然你不必通过阅读《OpenGL编程指南》一书来理解本书对命令的解释,但如果你已经读过它,你将会对这些命令有更深刻的理解。 如果你对计算机图形学还不太了解,那么请先从《OpenGL编程指南》一书入手学习,并同时参考下面这些书: ?James D. Foley、 Andries van Dam、Steven K. Feiner和John F. Hughes著,《计算机图形学:原理及应用》(Computer Graphics:Principles and Practice)。(Reading, MA:Addision-Wesley)。该书是一本计算机图形学的百科全书,它包含了丰富的信息量,但最好在你对这门学科有一定的实践经验之后再读它。ナAndrew S. Glassner 著,《3D计算机图形学:艺术家与设计师的用户指南》(3D Computer Graphics: A User誷 Guide for Artists and Designers)。(New York:Design Press)。这是一本非技术性的、综合介绍计算机图形学的书,它着重于所能获得的视觉效果而非如何获取这些效果的具体技巧。 ナOlin Lathrop著,《计算机图形学的工作原理》(The Way Computer Graphics Work)。(New York:John Wiley and Sons,Inc.)。这本书概括性地介绍了计算机图形学,主要面向初级和中级计算机用户。它介绍了理解计算机图形学所必需的一般概念。 0.2 字体约定 本书使用如下的字体约定: 黑体字(Bold)—命令和例行程序名; 斜体字(Italics)—变量名、自变量名、参数名、空间维数和文件名; 正体字(Regular)—枚举类型和定义的常量; 等宽字体(Monospace font)—示例代码。 值得注意的是本书所使用的命令名称都是缩写形式。许多OpenGL命令只是其他命令的变种。简言之,这里只使用函数的基本名称。如果此命令上加有星号(*),则说明它所代表的实际的命令名称可能比显示的命令名称要多。如,glVertex*代表所有指定顶点的命令变种所构成的命令。 多数命令的区别仅在于它们所带的自变量的数据类型。有些命令则在相关自变量的数目、这些自变量是否被指定为向量以及是否需在列表中单独指定等方面存在着区别。例如,你使用glVertex2f命令时必须以浮点数形式提供x和y的坐标;而使用glVertex3sv 命令时你需为x,y,z提供一个包含三个短整型值的数组。
OpenGL ES 3.0 英文版 第1章——OpenGL ES 3.0简介   第1章简单介绍OpenGL ES,概述了OpenGL ES 3.0图形管线,讨论了OpenGL ES 3.0的设计理念和限制,最后介绍了OpenGL ES 3.0中使用的一些约定和类型。   第2章——你好,三角形:一个OpenGL ES 3.0示例   第2章介绍绘制三角形的一个简单OpenGL ES 3.0示例。我们的目的是说明OpenGL ES 3.0程序的样子,向读者介绍一些API概念,并说明如何构建和运行OpenGL ES 3.0示例程序。   第3章——EGL简介   第3章介绍EGL——为OpenGL ES 3.0创建表面和渲染上下文的API。我们说明与原生窗口系统通信、选择配置和创建EGL渲染上下文及表面的方法,传授足够多的EGL知识,你可以了解到启动OpenGL ES 3.0进行渲染所需的所有知识。   第4章——着色器和程序   着色器对象和程序对象是OpenGL ES 3.0中最基本的对象。第4章介绍创建着色器对象、编译着色器和检查编译错误的方法。这一章还说明如何创建程序对象、将着色器对象连接到程序对象以及链接最终程序对象的方法。我们讨论如何查询程序对象的信息以及加载统一变量(uniform)的方法。此外,你将学习有关源着色器和程序二进制代码之间的差别以及它们的使用方法。   第5章——OpenGL ES着色语言   第5章介绍编写着色器所需的着色语言的基础知识。这些着色语言基础知识包括变量和类型、构造器、结构、数组、统一变量、统一变量块(uniform block)和输入/输出变量。该章还描述着色语言的某些更细微的部分,例如精度限定符和不变性。   第6章——顶点属性、顶点数组和缓冲区对象   从第6章开始(到第11章为止),我们将详细介绍管线,教授设置和编程图形管线各个部分的方法。这一旅程从介绍几何形状输入图形管线的方法开始,包含了对顶点属性、顶点数组和缓冲区对象的讨论。   第7章——图元装配和光栅化   在前一章讨论几何形状输入图形管线的方法之后,第7章将讨论几何形状如何装配成图元,介绍OpenGL ES 3.0中所有可用的图元类型,包括点精灵、直线、三角形、三角形条带和三角扇形。此外,我们还说明了在顶点上进行坐标变换的方法,并简单介绍了OpenGL ES 3.0管线的光栅化阶段。   第8章——顶点着色器   我们所介绍的管线的下一部分是顶点着色器。第8章概述了顶点着色器如何融入管线以及OpenGL ES 着色语言中可用于顶点着色器的特殊变量,介绍了多个顶点着色器的示例,包括逐像素照明和蒙皮(skinning)。我们还给出了用顶点着色器实现OpenGL ES 1.0(和1.1)固定功能管线的示例。   第9章——纹理   第9章开始介绍片段着色器,描述OpenGL ES 3.0中所有可用的纹理功能。该章提供了创建纹理、加载纹理数据以及纹理渲染的细节,描述了纹理包装模式、纹理过滤、纹理格式、压缩纹理、采样器对象、不可变纹理、像素解包缓冲区对象和Mip贴图。该章介绍了OpenGL ES 3.0支持的所有纹理类型:2D纹理、立方图、2D纹理数组和3D纹理。   第10章——片段着色器   第9章的重点是如何在片段着色器中使用纹理,第10章介绍编写片段着色器所需知道的其他知识。该章概述了片段着色器和所有可用的特殊内建变量,还演示了用片段着色器实现OpenGL ES 1.1中所有固定功能技术的方法。多重纹理、雾化、Alpha测试和用户裁剪平面的例子都使用片段着色器实现。   第11章——片段操作   第11章讨论可以适用于整个帧缓冲区或者在OpenGL ES 3.0片段管线中执行片段着色器后适用于单个片段的操作。这些操作包括剪裁测试、模板测试、深度测试、多重采样、混合和抖动。本章介绍OpenGL ES 3.0图形管线的最后阶段。   第12章——帧缓冲区对象   第12章讨论使用帧缓冲区对象渲染屏幕外表面。帧缓冲区对象有多种用法,最常见的是渲染到一个纹理。本章提供API帧缓冲区对象部分的完整概述。理解帧缓冲区对象对于实现许多高级特效(如反射、阴影贴图和后处理)至关重要。   第13章——同步对象和栅栏   第13章概述同步对象和栅栏,它们是在OpenGL ES 3.0主机应用和GPU执行中同步的有效图元。我们讨论同步对象和栅栏的使用方法,并以一个示例作为结束。   第14章——OpenGL ES 3.0高级编程   第14章是核心章节,将本书介绍的许多主题串联在一起。我们已经选择了高级渲染技术的一个样本,并展示了实现这些功能的示例。该章包含使用法线贴图的逐像素照明、环境贴图、粒子系统、图像后处理、程序纹理、阴影贴图、地形渲染

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值