当前位置: 首页 > news >正文

OpenGL ES 04 图片数据是怎么写入到对应纹理单元的

  1. 从指定路径加载图像并转换为 CGImage
  2. 获取图像的宽度和高度。
  3. 创建一个 RGB 颜色空间。
  4. 为图像数据分配内存。
  5. 创建一个位图上下文并将图像绘制到上下文中。
  6. 创建一个新的纹理对象并绑定到指定的纹理单元。
  7. 指定二维纹理图像。
  8. 释放分配的内存。
  9. 设置纹理参数,包括放大和缩小过滤器以及环绕方式。
func loadTexture(from path: String, index: Int) {// 尝试从指定路径加载图像,并将其转换为 CGImage。如果加载失败,则触发一个致命错误。guard let image = UIImage(named: path)?.cgImage else {fatalError("Failed to load image at path: \(path)")}// 获取图像的宽度和高度let width = image.widthlet height = image.height// 创建一个 RGB 颜色空间let colorSpace = CGColorSpaceCreateDeviceRGB()// 为图像数据分配内存。每个像素有 4 个字节(RGBA),总大小为宽度 * 高度 * 4。let rawData = calloc(height * width * 4, MemoryLayout<GLubyte>.size)// 每个像素的字节数let bytesPerPixel = 4// 每行的字节数let bytesPerRow = bytesPerPixel * width// 每个组件的位数let bitsPerComponent = 8// 创建一个位图上下文,用于绘制图像数据let context = CGContext(data: rawData,width: width,height: height,bitsPerComponent: bitsPerComponent,bytesPerRow: bytesPerRow,space: colorSpace,bitmapInfo: CGImageAlphaInfo.premultipliedLast.rawValue)// 将图像绘制到上下文中context?.draw(image, in: CGRect(x: 0, y: 0, width: width, height: height))// 创建一个新的纹理对象var texture: GLuint = 0glGenTextures(1, &texture)// 激活指定的纹理单元glActiveTexture(GLenum(GL_TEXTURE0 + Int32(index)))// 绑定纹理对象到 GL_TEXTURE_2D 目标glBindTexture(GLenum(GL_TEXTURE_2D), texture)// 指定二维纹理图像glTexImage2D(GLenum(GL_TEXTURE_2D), 0, GL_RGBA, GLsizei(width), GLsizei(height), 0, GLenum(GL_RGBA), GLenum(GL_UNSIGNED_BYTE), rawData)// 释放分配的内存free(rawData)// 设置纹理参数// 设置纹理放大过滤器为 GL_LINEAR(线性过滤)glTexParameteri(GLenum(GL_TEXTURE_2D), GLenum(GL_TEXTURE_MAG_FILTER), GL_LINEAR)// 设置纹理缩小过滤器为 GL_NEAREST(邻近过滤)glTexParameteri(GLenum(GL_TEXTURE_2D), GLenum(GL_TEXTURE_MIN_FILTER), GL_NEAREST)// 设置纹理在 S 方向上的环绕方式为 GL_REPEAT(重复)glTexParameteri(GLenum(GL_TEXTURE_2D), GLenum(GL_TEXTURE_WRAP_S), GL_REPEAT)// 设置纹理在 T 方向上的环绕方式为 GL_REPEAT(重复)glTexParameteri(GLenum(GL_TEXTURE_2D), GLenum(GL_TEXTURE_WRAP_T), GL_REPEAT)
}

http://www.lryc.cn/news/514386.html

相关文章:

  • C# 设计模式的六大原则(SOLID)
  • 数据库自增 id 过大导致前端时数据丢失
  • 第二十六天 自然语言处理(NLP)词嵌入(Word2Vec、GloVe)
  • MongoDB 固定集合
  • 数据结构9.3 - 文件基础(C++)
  • Leetcode 1254 Number of Closed Islands + Leetcode 1020 Number of Enclaves
  • Junit4单元测试快速上手
  • U盘提示格式化?原因、恢复方案与预防措施全解析
  • HTML——13.超链接
  • vue中的设计模式
  • 利用python将图片转换为pdf格式的多种方法,实现批量转换,内置模板代码,全网最全,超详细!!!
  • tcpdump的常见方法
  • 工控主板ESM7000/6800E支持远程桌面控制
  • wamp php7.4 运行dm8
  • HTML5 进度条(Progress Bar)详解
  • LabVIEW开发中常见硬件通讯接口快速识别
  • 高频 SQL 50 题(基础版)_1068. 产品销售分析 I
  • 笔记:一次mysql主从复制延迟高的处理尝试
  • 基于C语言的卡丁车管理系统【控制台应用程序】
  • Docker 搭建 Gogs
  • PostgreSQL的备份方式
  • Springboot 3项目整合Knife4j接口文档(接口分组详细教程)
  • 深入解析 Conda 安装的默认依赖包及其作用:conda create安装了哪些包(中英双语)
  • Redis核心技术知识点全集
  • 【Unity3D】ECS入门学习(九)SystemBase
  • 【Triton-ONNX】如何使用 ONNX 模型服务与 Triton 通信执行推理任务上-Triton快速开始
  • CertiK《Hack3d:2024年度安全报告》(附报告全文链接)
  • TIOBE 指数 12 月排行榜公布,VB.Net排行第九
  • 【网络协议】开放式最短路径优先协议OSPF详解(一)
  • 嵌入式Linux驱动开发的基本知识(驱动程序的本质、常见的设备类型、设备号的本质理解、设备实例的注册过程)