gpt4 book ai didi

iphone - 使用 `CVImageBufferRef` 将 `glTexImage2D` 转换为 OpenGL ES 纹理时如何消除伪影?

转载 作者:行者123 更新时间:2023-11-30 12:55:33 26 4
gpt4 key购买 nike

我尝试从 CVImageBufferRef 加载纹理:

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) 让 w = bytesPerRow/4

2) 让 w = bufferWidth

这两个选项在 iPhone 5s 上都能完美工作,但据我了解,由于 CVImageBufferRef 数据对齐,我在 iPhone 6 上出现了瑕疵。在 iPhone 6 上,bytesPerRow/4 等于 752,但 bufferWidth 等于 750。在这两种情况下,我都有以下工件:

第一种情况:图像右侧有一条 2 像素线。 (它是纹理的一部分,而不仅仅是黑色背景 View )

enter image description here

在第二种情况下:纹理发生了一些变化。

enter image description here

最佳答案

正如您所发现的,您需要处理行填充,但以 GL 完全忽略它的方式处理它。您当前的两种方法都将其视为实际的纹理数据,这就是它不起作用的原因。

您可以使用 UNPACK_ROW_LENGTH 跳过整个像素,并使用 UNPACK_ALIGNMENT 处理散乱的字节填充(在纹理上传之前通过 glPixelStorei 设置)。

我认为在您的情况下,您希望将 UNPACK_ROW_LENGTH 设置为 752,并将 glTexImage2D 宽度参数设置为 750。

关于iphone - 使用 `CVImageBufferRef` 将 `glTexImage2D` 转换为 OpenGL ES 纹理时如何消除伪影?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40438908/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com