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)
}