私はCVImageBufferRef
からテクスチャをロードしようとした:`CVImageBufferRef`を` glTexImage2D`を使ってOpenGL ESテクスチャに変換する際のアーティファクトを取り除く方法は?
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/4
は752
に等しいが、bufferWidth
は750
に等しい。そして、どちらの場合も、次のアーティファクトがあります。
最初のケースでは、 画像の右側に2ピクセルのラインがあります。第2のケースで
(それだけではなく、黒の背景ビュー、テクスチャの一部です): いくつかの地獄は、テクスチャで起こっています。