2016-11-05 2 views
0

私はCVImageBufferRefからテクスチャをロードしようとした:`CVImageBufferRef`を` glTexImage2D`を使ってOpenGL ESテクスチャに変換する際のアーティファクトを取り除く方法は?

2種類の方法で
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で完璧に動作しますが、I私が理解しているように、CVImageBufferRefデータの整列のためにiPhone 6にアーチファクトがあります。 iPhone 6の場合、bytesPerRow/4752に等しいが、bufferWidth750に等しい。そして、どちらの場合も、次のアーティファクトがあります。

最初のケースでは、 画像の右側に2ピクセルのラインがあります。第2のケースで

enter image description here

(それだけではなく、黒の背景ビュー、テクスチャの一部です): いくつかの地獄は、テクスチャで起こっています。

enter image description here

答えて

0

は、あなたが発見したとして、あなたは、行のパディングを扱うが、GLはそれを完全に無視するような方法でそれを処理する必要があります。どちらの方法も現実のテクスチャデータのように扱います。なぜそれが機能しないのかです。

ピクセル全体をスキップする場合はUNPACK_ROW_LENGTH、テクスチャをアップロードする前には、glPixelStoreiを使用して設定すると、ストラップなしのバイトパディングを処理する場合はUNPACK_ALIGNMENTを使用できます。私はあなたのケースで考える

あなたは750

UNPACK_ROW_LENGTHから752、そしてあなたの glTexImage2D幅パラメータを設定したいです
関連する問題