【OpenGL学习】第1课: 概念与流程理解

仅自学做笔记用,后续有错误会更改

理论

  1. 什么是OpenGL:
  • 一般它被认为是一个API(Application Programming Interface, 应用程序编程接口),包含了一系列可以操作图形、图像的函数。然而,OpenGL本身并不是一个API,它仅仅是一个由Khronos组织制定并维护的规范(Specification),其具体的实现由各大显卡厂商(或爱好者)编写,OpenGL只关注其功能和结果与规范匹配就行。
  • OpenGL本身可以理解为一个大型状态机(State Machine):一系列的变量描述OpenGL此刻应当如何运行。OpenGL的状态通常被称为OpenGL上下文(Context)。我们通常使用如下途径去更改OpenGL状态:设置选项,操作缓冲。最后,我们使用当前OpenGL上下文来渲染。
  1. 核心模式与立即渲染模式:
  • 早期的OpenGL使用立即渲染模式(Immediate mode,也就是固定渲染管线),这个模式下绘制图形很方便。OpenGL的大多数功能都被库隐藏起来,开发者很少有控制OpenGL如何进行计算的自由。而开发者迫切希望能有更多的灵活性。随着时间推移,规范越来越灵活,开发者对绘图细节有了更多的掌控。立即渲染模式确实容易使用和理解,但是效率太低。因此从OpenGL3.2开始,规范文档开始废弃立即渲染模式,并鼓励开发者在OpenGL的核心模式(Core-profile)下进行开发,这个分支的规范完全移除了旧的特性。
  • 本文档针对核心模式(Core-profile)学习。
  1. 核心流程:
  • 生成→绑定→设置属性→解绑
  • 生成对象:通过glGen*类函数获取唯一 ID(如glGenTextures生成纹理 ID)。
  • 绑定对象:通过glBind*类函数将对象绑定到目标(如glBindTexture绑定纹理到GL_TEXTURE_2D)。
  • 操作对象:通过针对目标的函数设置属性(如glTexParameter设置纹理参数)。
  • 解绑对象:绑定0解除关联,避免误操作。

代码

  • 整个OpenGL最为关键的一段代码示例
c 复制代码
// 创建对象
unsigned int objectId = 0;
glGenObject(1, &objectId);
// 绑定对象至上下文
glBindObject(GL_WINDOW_TARGET, objectId);
// 设置当前绑定到 GL_WINDOW_TARGET 的对象的一些选项
glSetObjectOption(GL_WINDOW_TARGET, GL_OPTION_WINDOW_WIDTH, 800);
glSetObjectOption(GL_WINDOW_TARGET, GL_OPTION_WINDOW_HEIGHT, 600);
// 将上下文对象设回默认
glBindObject(GL_WINDOW_TARGET, 0);

代码解析

  1. 初始化对象 ID
c 复制代码
unsigned int objectId = 0;

作用:定义一个变量用于存储后续生成的 "对象 ID"。

细节:在 OpenGL 中,0通常表示 "默认 / 无效对象",所有有效的对象 ID 都是非 0 的正整数(由系统生成)。

  1. 生成对象(获取唯一 ID)。
c 复制代码
glGenObject(1, &objectId);
  • 函数作用:向系统申请生成一个 "对象",并获取它的唯一标识(ID)。
  • 参数解析:
    • 第一个参数1:表示要生成的对象数量(这里只生成 1 个)。
    • 第二个参数&objectId:指向存储对象 ID 的变量的指针(生成后,objectId会被赋值为一个非 0 的有效 ID)。
  • 类比:类似现实中 "办银行卡",系统给你一张唯一的卡号(ID),后续通过卡号操作这张卡。
  1. 绑定对象到上下文(指定 "当前操作的对象")
c 复制代码
glBindObject(GL_WINDOW_TARGET, objectId);
  • 函数作用:将生成的对象(objectId)绑定到上下文的 "目标(GL_WINDOW_TARGET)" 上,后续对该目标的操作会直接作用于这个绑定的对象。
  • 参数解析:
    • 第一个参数GL_WINDOW_TARGET:枚举值,表示 "窗口目标"(即这个对象是用于窗口的,OpenGL 中不同类型的对象有不同的目标,如纹理目标GL_TEXTURE_2D、缓冲目标GL_ARRAY_BUFFER等)。
    • 第二个参数objectId:要绑定的对象 ID(即步骤 2 生成的 ID)。
      核心意义:OpenGL 上下文一次只能 "关注" 一个对象(针对某个目标),绑定后,所有对该目标的操作都会 "精准命中" 绑定的对象(类似 "选中文件后,按删除键才会删除选中的文件")。
  1. 设置对象属性(针对当前绑定的对象)
c 复制代码
glSetObjectOption(GL_WINDOW_TARGET, GL_OPTION_WINDOW_WIDTH, 800);
glSetObjectOption(GL_WINDOW_TARGET, GL_OPTION_WINDOW_HEIGHT, 600);
  • 函数作用:设置 "当前绑定到GL_WINDOW_TARGET的对象" 的属性(这里是窗口的宽和高)。
  • 参数解析:
    • 第一个参数GL_WINDOW_TARGET:指定要操作的目标(因为当前该目标绑定了objectId,所以实际操作的是objectId对应的对象)。
    • 第二个参数GL_OPTION_WINDOW_WIDTH/GL_OPTION_WINDOW_HEIGHT:枚举值,表示要设置的属性(窗口宽度 / 高度)。
    • 第三个参数800/600:属性的具体值(这里将窗口宽设为 800 像素,高设为 600 像素)。
  1. 解绑对象(恢复默认状态)
c 复制代码
glBindObject(GL_WINDOW_TARGET, 0);
  • 函数作用:将GL_WINDOW_TARGET目标的 "当前绑定对象" 设为0(默认值),即解除之前的绑定。
  • 意义:避免后续操作(如误操作其他属性)影响已设置好的对象(类似 "编辑完文件后取消选中,防止误删除")。
相关推荐
wdfk_prog17 小时前
[Linux]学习笔记系列 -- [block]bio
linux·笔记·学习
90848690518 小时前
文旅业务相关前沿技术应用
学习·产品经理
GIS学姐嘉欣18 小时前
地信、测绘、遥感等专业免费学习网站推荐
学习·gis开发·webgis
今天你TLE了吗21 小时前
Stream流学习总结
java·学习
周全全1 天前
基于ElasticSearch的语义检索学习-向量化数据、向量化相似度、向量化检索
大数据·学习·elasticsearch
4***72131 天前
网络爬虫学习:借助DeepSeek完善爬虫软件,实现模拟鼠标右键点击,将链接另存为本地文件
爬虫·学习·计算机外设
t***31651 天前
爬虫学习案例3
爬虫·python·学习
hhcccchh1 天前
学习vue第七天 从单页面应用(SPA)进化为后台管理系统架构
vue.js·学习·系统架构
文涛是个小白呀1 天前
Java集合大调研
java·学习·链表·面试
hd51cc1 天前
MFC多线程学习笔记三:线程间的通信
笔记·学习