Я пытался загрузить текстуры из CVImageBufferRef
:Как избавиться от артефактов при преобразовании `CVImageBufferRef` в текстуру OpenGL ES с помощью` glTexImage2D`?
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))
}
2 различными способами:
1) let w = bytesPerRow/4
2) let w = bufferWidth
Оба варианта отлично работают на iPhone 5s, но я есть артефакты на iPhone 6 из-за CVImageBufferRef
выравнивания данных, как я понимаю. На iPhone 6 bytesPerRow/4
равен 752
, но bufferWidth
равен 750
. И в обоих случаях у меня есть следующие артефакты:
В первом случае: есть 2-пиксельная линия в правой части изображения. (Это часть текстуры, а не только черный фон вид)
Во втором случае: некоторые чертовщина с текстурой.