我有图像数据,我想得到一个用作opengl纹理的子图像.
glGenTextures(1, &m_name);
glGetIntegerv(GL_TEXTURE_BINDING_2D, &oldName);
glBindTexture(GL_TEXTURE_2D, m_name);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, m_width, m_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, m_data);
Run Code Online (Sandbox Code Playgroud)
如何获得作为纹理加载的图像的子图像.我认为它与使用glTexSubImage2D有关,但我不知道如何使用它来创建我可以加载的新纹理.呼叫:
glTexSubImage2D(GL_TEXTURE_2D, 0, xOffset, yOffset, xWidth, yHeight, GL_RGBA, GL_UNSIGNED_BYTE, m_data);
Run Code Online (Sandbox Code Playgroud)
我什么都看不到,调用glCopyTexSubImage2D只是占用了我的帧缓冲区.谢谢
我试过谷歌和stackoverflow但我似乎无法找到以CVOpenGLESTexture开头的函数的官方文档.我可以看到它们来自核心视频,我知道它们是在iOS 5上添加的,但搜索文档并没有给我任何东西.
我正在寻找有关参数的信息,他们做什么,如何使用它们等,就像在其他苹果框架中一样.
到目前为止我所能做的就是命令点击它来查看信息,但这感觉非常奇怪.或者有没有办法添加它,以便它可以显示在xcode右侧的快速帮助?
如果这是一个愚蠢的问题,谢谢,对不起.
PD:核心视频参考指南似乎也没有解释这些.
我有一个使用 ScreenCaptureKit 的项目。由于超出问题范围的各种原因,我配置 ScreenCaptureKit 使用的格式是kCVPixelFormatType_32BGRA——我需要原始 BGRA 数据,稍后会对其进行操作。
当我从数据构造一个CGImage或时,显示和一些窗口看起来很好(完整的代码包含在问题的底部 - 这只是转换的摘录)。NSImage
guard let cvPixelBuffer = sampleBuffer.imageBuffer else { return }
CVPixelBufferLockBaseAddress(cvPixelBuffer, .readOnly)
defer { CVPixelBufferUnlockBaseAddress(cvPixelBuffer, .readOnly) }
let vImageBuffer: vImage_Buffer = vImage_Buffer(data: CVPixelBufferGetBaseAddress(cvPixelBuffer),
height: vImagePixelCount(CVPixelBufferGetHeight(cvPixelBuffer)),
width: vImagePixelCount(CVPixelBufferGetWidth(cvPixelBuffer)),
rowBytes: CVPixelBufferGetWidth(cvPixelBuffer) * 4)
let cgImageFormat: vImage_CGImageFormat = vImage_CGImageFormat(
bitsPerComponent: 8,
bitsPerPixel: 32,
colorSpace: CGColorSpaceCreateDeviceRGB(),
bitmapInfo: CGBitmapInfo(rawValue: CGImageAlphaInfo.last.rawValue),
renderingIntent: .defaultIntent
)!
if let cgImage: CGImage = try? vImageBuffer.createCGImage(format: cgImageFormat) {
let nsImage = NSImage(cgImage: cgImage, …Run Code Online (Sandbox Code Playgroud) 我有一个 CVImageBuffer,它的记录高度为 640 像素,宽度为 852 像素。每行的字节数为 3456。您会注意到 3456/852px != 4(类似于 4.05)。经过一些检查,864 将是使 bytesPerRow/width = 4.0 的宽度。因此,每行似乎都有一个额外的 12px(填充在右侧)。我假设这是因为这些缓冲区针对该图像没有的某些倍数进行了优化。
当我在 OpenGL 中渲染出这个缓冲区时,它看起来很糟糕(见下文)。我注意到该模式每 71 像素重复一次,这是有道理的,因为如果有额外的 12 像素,则 (852/12 像素 = 71)。因此,额外的 12 个像素似乎是导致问题的原因。
如何非常快速地摆脱这些额外的像素,然后使用这些数据读入 OpenGL ES?或者更确切地说,我如何通过跳过每一行上的这些额外像素来读入 OpenGL ES?
