Swift:用OpenGL创建一个UIImage(glReadPixels)

时间:2015-09-24 15:37:40

标签: ios swift opengl-es uiimage

我正在根据this tutorial学习OpenGL,并尝试编写绘制彩色矩形的简单函数。

输入参数:

size: CGSize,
scale: CGFloat,

这部分代码可以正常使用:

// Setup context
let api = EAGLRenderingAPI.OpenGLES3
let context = EAGLContext(API: api)
EAGLContext.setCurrentContext(context)

// Setup render buffer
var renderBuffer = GLuint()
glGenRenderbuffers(1, &renderBuffer)
glBindRenderbuffer(GLenum(GL_RENDERBUFFER), renderBuffer)
let bufferWidth = GLsizei(size.width * scale)
let bufferHeight = GLsizei(size.height * scale)
let bufferFormat = GLenum(GL_RGBA8)
glRenderbufferStorage(GLenum(GL_RENDERBUFFER), bufferFormat, bufferWidth, bufferHeight)

// Setup frame buffer
var frameBuffer = GLuint()
glGenFramebuffers(1, &frameBuffer)
glBindFramebuffer(GLenum(GL_FRAMEBUFFER), frameBuffer)
glFramebufferRenderbuffer(GLenum(GL_FRAMEBUFFER), GLenum(GL_COLOR_ATTACHMENT0), GLenum(GL_RENDERBUFFER), renderBuffer)

// Draw
glClearColor(1, 0.5, 0.5, 1)
glClear(GLbitfield(GL_COLOR_BUFFER_BIT))

最有问题的部分是创建一个UIImage:

// Get bytes
let byteLength = Int(bufferWidth * bufferHeight) * 4;
let bytes = malloc(byteLength)
glReadPixels(0, 0, bufferWidth, bufferHeight, bufferFormat, GLenum(GL_UNSIGNED_BYTE), bytes)
print( glGetError() ) // prints 1280 (GL_INVALID_ENUM) !!!

// Create a CGImage
let dataProvider = CGDataProviderCreateWithData(nil, bytes, byteLength, nil)
let colorspace = CGColorSpaceCreateDeviceRGB()
let bitmapInfo: CGBitmapInfo = [.ByteOrder32Little, CGBitmapInfo(rawValue: CGImageAlphaInfo.Last.rawValue)]
let aCGImage = CGImageCreate(
    Int(bufferWidth), 
    Int(bufferHeight), 
    8, 
    4, 
    4 * Int(bufferWidth), 
    colorspace, 
    bitmapInfo, 
    dataProvider, 
    nil, 
    false, 
    .RenderingIntentDefault
    )!
let anUIImage = UIImage(CGImage: aCGImage, scale: scale, orientation: .Up)

虽然glReadPixels生成GL_INVALID_ENUM错误,但我甚至不确定创建UIImage的方式是否正确。

1 个答案:

答案 0 :(得分:1)

OpenGL ES的格式非常有限,可以接受。有一个很棒的网站,有OpenGL文档http://docs.gl

您对http://docs.gl/es2/glReadPixelshttp://docs.gl/es3/glReadPixels感兴趣。缓冲区格式应为GL_RGBAGL_BGRA

也许更好的方法是https://stackoverflow.com/a/9704392/1351828