【发布时间】:2017-03-19 05:53:59
【问题描述】:
我尝试从CVImageBufferRef加载纹理:
func createTextureFromCVImageBufferRef(buffer: CVImageBufferRef) {
let bufferHeight = CVPixelBufferGetHeight(buffer)
let bufferWidth = CVPixelBufferGetWidth(buffer)
let bytesPerRow = CVPixelBufferGetBytesPerRow(buffer)
let w = bytesPerRow / 4 // I option
//let w = bufferWidth // II option
let h = bufferHeight
CVPixelBufferLockBaseAddress(buffer, CVPixelBufferLockFlags(rawValue: CVOptionFlags(0)))
glTexParameteri(GLenum(GL_TEXTURE_2D), GLenum(GL_TEXTURE_MIN_FILTER), GL_LINEAR)
glTexParameteri(GLenum(GL_TEXTURE_2D), GLenum(GL_TEXTURE_MAG_FILTER), GL_LINEAR)
glTexParameteri(GLenum(GL_TEXTURE_2D), GLenum(GL_TEXTURE_WRAP_S), GL_CLAMP_TO_EDGE)
glTexParameteri(GLenum(GL_TEXTURE_2D), GLenum(GL_TEXTURE_WRAP_T), GL_CLAMP_TO_EDGE)
glTexImage2D(GLenum(GL_TEXTURE_2D), GLint(0), GLint(GL_RGBA), GLsizei(w), GLsizei(h), GLint(0), GLenum(GL_BGRA), GLenum(GL_UNSIGNED_BYTE), CVPixelBufferGetBaseAddress(buffer))
}
有两种不同的方式:
1)let w = bytesPerRow / 4
2)let w = bufferWidth
这两个选项在 iPhone 5s 上都能完美运行,但据我所知,由于 CVImageBufferRef 数据对齐,我在 iPhone 6 上出现了瑕疵。在 iPhone 6 上,bytesPerRow / 4 等于 752,但 bufferWidth 等于 750。在这两种情况下,我都有以下工件:
在第一种情况下: 图像右侧有一条 2 像素线。 (它是纹理的一部分,而不仅仅是黑色背景视图)
在第二种情况下: 纹理正在发生一些地狱。
【问题讨论】:
标签: iphone swift opengl-es textures opengl-es-2.0