2016-11-05 3 views
0

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)

enter image description here

Im zweiten Fall: einige Teufel sind los mit der Textur.

enter image description here

Antwort

0

Wie Sie gefunden haben, müssen Sie die Zeile Polsterung, zu handhaben, aber es so handhaben, dass GL es völlig ignoriert. Beide Ihre aktuellen Ansätze behandeln es wie tatsächliche Texturdaten, weshalb es nicht funktioniert.

Sie können UNPACK_ROW_LENGTH verwenden, um ganze Pixel zu überspringen, und UNPACK_ALIGNMENT, um das Auffüllen von Byte-Padding zu verarbeiten (vor dem Textupload über glPixelStorei eingestellt).

ich in Ihrem Fall denken Sie UNPACK_ROW_LENGTH-752 und Ihre glTexImage2D Breite Parameter auf 750.

einstellen