gpt4 book ai didi

iphone - 将 UIView 的内容渲染为 OpenGL 纹理

转载 作者:行者123 更新时间:2023-12-03 18:26:47 32 4
gpt4 key购买 nike

有没有办法在 iOS 中使用 OpenGL 将 UIView 的内容渲染为纹理?或者 CGLayer 的内容?

最佳答案

您可以使用 View 的 Layer 属性来获取 CALayer 并使用 renderInContext: 来绘制到 CoreGraphics 上下文中。您可以使用自己分配的内存来设置 CoreGraphics 上下文,以便接收像素缓冲区。然后您可以通过正常方法将其上传到 OpenGL。

所以:有一种方法可以获取 UIView 的像素内容,并且 OpenGL 将接受像素缓冲区。两者之间没有特定的联系。

即兴编码,过程如下:

UIView *view = ... something ...;

// make space for an RGBA image of the view
GLubyte *pixelBuffer = (GLubyte *)malloc(
4 *
view.bounds.size.width *
view.bounds.size.height);

// create a suitable CoreGraphics context
CGColorSpaceRef colourSpace = CGColorSpaceCreateDeviceRGB();
CGContextRef context =
CGBitmapContextCreate(pixelBuffer,
view.bounds.size.width, view.bounds.size.height,
8, 4*view.bounds.size.width,
colourSpace,
kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);
CGColorSpaceRelease(colourSpace);

// draw the view to the buffer
[view.layer renderInContext:context];

// upload to OpenGL
glTexImage2D(GL_TEXTURE_2D, 0,
GL_RGBA,
view.bounds.size.width, view.bounds.size.height, 0,
GL_RGBA, GL_UNSIGNED_BYTE, pixelBuffer);

// clean up
CGContextRelease(context);
free(pixelBuffer);

这并不能解决在没有非二次方纹理扩展的硬件上围绕非二次方尺寸 View 的问题,并且假设已经生成并绑定(bind)了合适的 GL 纹理名称。自己检查一下,但我认为 SGX 硬件(即 iPhone 3GS 及以上、iPad 以及除 8GB 第三代 iPod Touch 及以上以外的所有设备)支持非 2 的幂,但 MBX 不支持。

这里处理非二次幂纹理的最简单方法可能是创建足够大的二次幂纹理,并使用 glTexSubImage2D 仅上传源 UIView 中的部分。

关于iphone - 将 UIView 的内容渲染为 OpenGL 纹理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4118778/

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