Ich habe versucht, Textur aus CVImageBufferRef
zu laden:Wie werden Artefakte beim Konvertieren von `CVImageBufferRef` in OpenGL ES Textur mit` glTexImage2D` beseitigt?
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))
}
auf 2 verschiedene Arten:
1) let w = bytesPerRow/4
2) let w = bufferWidth
Beide Optionen auf dem iPhone 5s perfekt funktionieren, aber ich habe Artefakte auf dem iPhone 6 wegen CVImageBufferRef
Datenausrichtung, wie ich es verstehe. Auf iPhone 6 bytesPerRow/4
ist gleich 752
, aber bufferWidth
gleich 750
. Und in beiden Fällen habe ich die folgenden Artefakte:
Im ersten Fall: gibt es eine 2-Pixel-Zeile auf der rechten Seite des Bildes. (Es ist Teil der Textur, nicht nur schwarze Hintergrund Ansicht)
Im zweiten Fall: einige Teufel sind los mit der Textur.