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

  1. 从指定路径加载图像并转换为 CGImage
  2. 获取图像的宽度和高度。
  3. 创建一个 RGB 颜色空间。
  4. 为图像数据分配内存。
  5. 创建一个位图上下文并将图像绘制到上下文中。
  6. 创建一个新的纹理对象并绑定到指定的纹理单元。
  7. 指定二维纹理图像。
  8. 释放分配的内存。
  9. 设置纹理参数,包括放大和缩小过滤器以及环绕方式。
cpp 复制代码
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.width
    let 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 = 0
    glGenTextures(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)
}
相关推荐
V哥AI增长5 分钟前
Schema.org 结构化数据与GEO技术落地:AI引擎引用机制与JSON-LD部署实证研究
大数据·运维·人工智能
马拉AI12 分钟前
腾讯开源 Agent 记忆系统,AI“换对话就忘”的问题有了新解法(附安装使用教程)
人工智能·算法·开源·科研
IT_陈寒14 分钟前
JavaScript类型转换把我坑惨了,这破玩意真该早点搞明白
前端·人工智能·后端
用户9385156350740 分钟前
手写一个 LLM Harness 框架:用工程化手段把大模型幻觉踩在脚下
javascript·人工智能·后端
前端开发江鸟43 分钟前
我能解释 RAG、MCP 和 Eval,却画不出一条完整的 Agent 链路
人工智能
ivywriter2 小时前
【具身智能】物理AI具体指什么,和具身智能是什么关系?
人工智能
new_zhou2 小时前
C++ 项目 AI 协作指南(Windows / MSVC 环境)
c++·人工智能·windows
洛阳泰山2 小时前
AI 应用层被 Python 卷成红海,为什么我偏要用 Java 造一个 RAG + 工作流引擎?
java·人工智能·后端
wangray1997droid2 小时前
让 AI 拥有“真实记忆“:一次从碎片到叙事的记忆系统质变
人工智能
一次旅行2 小时前
AI 前沿日报 | 2026年08月08日 星期六
人工智能