2016-11-05 3 views
0

Я пытался загрузить текстуры из 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-пиксельная линия в правой части изображения. (Это часть текстуры, а не только черный фон вид)

enter image description here

Во втором случае: некоторые чертовщина с текстурой.

enter image description here

ответ

0

Как вы нашли вам нужно обрабатывать строки отступы, но обрабатывать его таким образом, что GL игнорирует его полностью. Оба ваших текущих подхода рассматривают его как фактические данные текстуры, поэтому он не работает.

Вы можете использовать UNPACK_ROW_LENGTH, чтобы пропускать все пиксели, и UNPACK_ALIGNMENT для обработки отложенного байтового заполнения (устанавливается через glPixelStorei перед загрузкой текстуры).

Я думаю, в вашем случае, если вы хотите установить UNPACK_ROW_LENGTH на 752, и ваш glTexImage2D ширина параметра до 750.