【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(默认值),即解除之前的绑定。
  • 意义:避免后续操作(如误操作其他属性)影响已设置好的对象(类似 "编辑完文件后取消选中,防止误删除")。
相关推荐
西岸行者5 天前
学习笔记:SKILLS 能帮助更好的vibe coding
笔记·学习
悠哉悠哉愿意5 天前
【单片机学习笔记】串口、超声波、NE555的同时使用
笔记·单片机·学习
别催小唐敲代码5 天前
嵌入式学习路线
学习
毛小茛5 天前
计算机系统概论——校验码
学习
babe小鑫5 天前
大专经济信息管理专业学习数据分析的必要性
学习·数据挖掘·数据分析
winfreedoms5 天前
ROS2知识大白话
笔记·学习·ros2
在这habit之下5 天前
Linux Virtual Server(LVS)学习总结
linux·学习·lvs
我想我不够好。5 天前
2026.2.25监控学习
学习
im_AMBER5 天前
Leetcode 127 删除有序数组中的重复项 | 删除有序数组中的重复项 II
数据结构·学习·算法·leetcode
CodeJourney_J5 天前
从“Hello World“ 开始 C++
c语言·c++·学习