【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(默认值),即解除之前的绑定。
  • 意义:避免后续操作(如误操作其他属性)影响已设置好的对象(类似 "编辑完文件后取消选中,防止误删除")。
相关推荐
黑岚樱梦2 小时前
计算机网络第六章学习
学习·计算机网络
c0d1ng2 小时前
自建督学习——BERT(第二十二周周报)
人工智能·学习·bert
木霖森772 小时前
软件工程入门学习
学习·软件工程
BullSmall3 小时前
《道德经》第五十章
学习
Larry_Yanan4 小时前
QML学习笔记(五十三)QML与C++交互:数据转换——序列类型与 JavaScript 数组的转换
c++·笔记·学习
snakecy4 小时前
cuda10 cudnn7.5--旧版本
python·学习
2301_796512525 小时前
Rust编程学习 - 自动解引用的用处,如何进行“解引用”(Deref) 是“取引用”(Ref) 的反操作
开发语言·学习·rust
张永清-老清5 小时前
每周读书与学习->JMeter主要元件详细介绍(四)再谈取样器
学习·jmeter·性能优化·性能调优·jmeter性能测试·性能分析·每周读书与学习
我命由我123455 小时前
Photoshop - Photoshop 工具栏(20)混合器画笔工具
经验分享·笔记·学习·ui·职场和发展·职场发展·photoshop