- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如何将一系列 IOSurfaces 绘制到另一个然后将其绘制到屏幕上?我在 MultiGPU 示例项目中尝试过一些来自苹果的源代码,但我设法做的最好的事情就是绘制一个白屏或获得大量的工件并使应用程序崩溃。
我是 openGL 的新手,我不太了解帧缓冲区和纹理的绑定(bind)以及它们如何与 IOSurfaces 交互。
这就是我必须从 IOSurface(直接来自 Apple 的源代码)创建纹理
// Create an IOSurface backed texture
// Create an FBO using the name of this texture and bind the texture to the color attachment of the FBO
- (GLuint)setupIOSurfaceTexture:(IOSurfaceRef)ioSurfaceBuffer {
GLuint name;
CGLContextObj cgl_ctx = (CGLContextObj)[[self openGLContext] CGLContextObj];
glGenTextures(1, &name);
glBindTexture(GL_TEXTURE_RECTANGLE_EXT, name);
CGLTexImageIOSurface2D(cgl_ctx, GL_TEXTURE_RECTANGLE_EXT, GL_RGBA, 512, 512, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV,
ioSurfaceBuffer, 0);
glTexParameteri(GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
// Generate an FBO using the same name with the same texture bound to it as a render target.
glBindTexture(GL_TEXTURE_RECTANGLE_EXT, 0);
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, name);
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_RECTANGLE_EXT, name, 0);
if(!_depthBufferName) {
glGenRenderbuffersEXT(1, &_depthBufferName);
glRenderbufferStorageEXT(GL_TEXTURE_RECTANGLE_EXT, GL_DEPTH, 512, 512);
}
glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_TEXTURE_RECTANGLE_EXT, _depthBufferName);
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
return name;
}
我有这段代码可以将表面绘制到屏幕上。 (同样来自 Apple 的来源)
// Fill the view with the IOSurface backed texture
- (void)textureFromCurrentIOSurface {
NSRect bounds = [self bounds];
CGLContextObj cgl_ctx = (CGLContextObj)[[self openGLContext] CGLContextObj];
// Render quad from our iosurface texture
glViewport(0, 0, (GLint)bounds.size.width, (GLint)bounds.size.height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0.0, (GLfloat)bounds.size.width, 0.0f, (GLfloat)bounds.size.height, -1.0f, 1.0f);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glClear(GL_COLOR_BUFFER_BIT);
glBindTexture(GL_TEXTURE_RECTANGLE_EXT, [[NSApp delegate] currentTextureName]); // Grab the texture from the delegate
glEnable(GL_TEXTURE_RECTANGLE_EXT);
glTexEnvi(GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_ENV_MODE, GL_REPLACE);
glBegin(GL_QUADS);
glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
glTexCoord2f(0.0f, 0.0f);
glVertex2f(0.0f, 0.0f);
glTexCoord2f(512.0f, 0.0f);
glVertex2f((GLfloat)bounds.size.width, 0.0f);
glTexCoord2f(512.0f, 512.0f);
glVertex2f((GLfloat)bounds.size.width, (GLfloat)bounds.size.height);
glTexCoord2f(0.0f, 512.0f);
glVertex2f(0.0f, (GLfloat)bounds.size.height);
glEnd();
glDisable(GL_TEXTURE_RECTANGLE_EXT);
}
在将单个 IOSurface 绘制到屏幕的情况下,这工作正常。我缺少什么来将 IOSurface 绘制到另一个?
假设我有纹理 A、B、C 和 D,我想:
-在特定区域将A绘制到C上,
- 将 B 绘制到不同区域的 C 上(可能与 A 重叠),
- 将 C 绘制到屏幕上。
最佳答案
我使用以下代码解决了这个问题,但是在绘制之前缩放 IOSurface 存在一些小问题。
- (void)renderIOSurface:(IOSurfaceRef)surface toBuffer:(GLuint)buffer atPoint:(CGPoint)point withSize:(CGSize)size {
CGLContextObj cgl_ctx = (CGLContextObj)[[self openGLContext] CGLContextObj];
// Bind framebuffer
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, buffer);
glViewport(0, 0, TEXWIDE, TEXHIGH);
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
glOrtho(0.0, TEXWIDE, 0.0, TEXHIGH, -1, 1);
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadIdentity();
GLsizei sH = (GLsizei)IOSurfaceGetHeight(surface);
GLsizei sW = (GLsizei)IOSurfaceGetWidth(surface);
// Create texture
GLuint name;
glGenTextures(1, &name);
glEnable(GL_TEXTURE_RECTANGLE_EXT);
glBindTexture(GL_TEXTURE_RECTANGLE_EXT, name);
CGLTexImageIOSurface2D(cgl_ctx, GL_TEXTURE_RECTANGLE_EXT, GL_RGBA, sW, sH, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, surface, 0);
glTexParameteri(GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
// glTexParameteri(GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
// glTexParameteri(GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glBindTexture(GL_TEXTURE_RECTANGLE_EXT, 0);
//glDisable(GL_BLEND);
glBindTexture(GL_TEXTURE_RECTANGLE_EXT, name);
glTexParameteri(GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
glBegin(GL_QUADS);
glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
glTexCoord2f(0.0f, 0.0f);
glVertex2f(point.x, point.y);
glTexCoord2f(sW, 0.0f);
glVertex2f(point.x + size.width, point.y);
glTexCoord2f(sW, sH);
glVertex2f(point.x + size.width, point.y + size.height);
glTexCoord2f(0.0f, sH);
glVertex2f(point.x, point.y + size.height);
glEnd();
//glDisable(GL_TEXTURE_RECTANGLE_EXT);
// Bindback to normal
glBindTexture(GL_TEXTURE_RECTANGLE_EXT, 0);
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
// Delete the name texture
glDeleteTextures(1, &name);
// [[self openGLContext] flushBuffer];
// This flush is necessary to ensure proper behavior if the MT engine is enabled.
// glFlush();
glMatrixMode(GL_MODELVIEW);
glPopMatrix();
glMatrixMode(GL_PROJECTION);
glPopMatrix();
glFlush();
}
关于objective-c - 将 IOSurfaces 绘制到另一个 IOSurface,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14097015/
如何将一系列 IOSurfaces 绘制到另一个然后将其绘制到屏幕上?我在 MultiGPU 示例项目中尝试过一些来自苹果的源代码,但我设法做的最好的事情就是绘制一个白屏或获得大量的工件并使应用程序崩
这个问题是对: 的扩展链接-1:Creating an image out of the ios surface and saving it Link-2:Taking Screenshots fro
当我尝试编译我的调整时出现此错误。 'IOSurface/IOSurfaceAPI.h' file not found #include 我试过了 this answer ,但我在计算机上找不到 /
要使用快速屏幕截图,我需要执行一些 IOSurfaceRef 操作——使用 CARenderServerRenderDisplay(0, CFSTR("LCD"), iosurfaceref, 0,
如果我使用 IOSurface 框架为我的应用制作视频,苹果会拒绝我的应用吗 最佳答案 是的,如果您链接 IOSurface Apple 将拒绝您的应用程序。 商店中的一些项目正在使用它,但他们可
这是一个由两部分组成的问题。我有以下代码可以抓取当前显示表面并从表面创建视频(一切都在后台发生)。 for(int i=0;i<100;i++){ IOMobileFramebuf
对于我当前的项目,我正在读取 iPhone 的主摄像头输出。然后,我通过以下方法将像素缓冲区转换为缓存的 OpenGL 纹理:CVOpenGLESTextureCacheCreateTextureFr
写入IOSurface时需要使用哪些API,以及需要采取哪些预防措施在 XPC 进程中,该进程也被用作 MTLTexture 的后备存储。在主应用程序中? 在我的 XPC 服务中,我有以下内容: IO
我想使用 mipmapping 渲染 IOSurface 纹理。 我正在从 IOSurface 生成 OpenGL 纹理,如下所示: let error = CGLTexImageIOSurface2
我正在尝试修改 Apple MultiGPUIOSurface 示例(特别是文件 http://developer.apple.com/library/mac/#samplecode/MultiGPU
我正在尝试在 Swift 中创建一个 IOSurface,然后从中创建一个 CIImage。 IOSurfaceRef 看起来不错,但 CIImage 返回 nil: textureImage
我在 iOS 12 及更高版本的应用程序中遇到内存问题。 IOSurface 在 iOS 12.1.1 中同时逐渐增加,在 iOS 11 版本中运行良好。我在下面附上了问题截图, 为什么iOS 12版
我有一个 IOSurface 支持的 CVPixelBuffer,它以 30fps 从外部源更新。我想在 NSView 中呈现图像数据的预览——对我来说最好的方法是什么? 我可以直接在 View 上设
我正在尝试使用 CVPixelBufferCreateWithIOSurface 和从 IOSurfaceGetBaseAddressOfPlane 读取像素来捕获 IOSurface。 但是,在较新
我想从后台服务截屏。私有(private) API 很好,因为我不需要提交到应用商店。我已经尝试过 UIGetScreenImage,它在后台应用程序中不起作用。 我正在使用从 SO 获得的以下代码。
这个错误很奇怪。昨天一切都很好。我安装了Xcode 9 beta,然后我使用Xcode 8在iPhone 6p,iOS 9.3.2上运行我的应用程序(我昨天可以这样做,我可以仍然在模拟器上运行应用程序
当我运行我的项目时,你能帮我解决这个问题吗: Could not load IOSurface for time string. Rendering locally instead 我不知道我的编码是
在使用我的 ipad 应用程序时,我收到了一系列警告(Mar 18 11:18:06 kernel[0] : IOSurface warning: buffer allocation failed.
所以我从网络回调(voip 应用程序)中获取 3 个单独数组中的原始 YUV 数据。根据我的理解,您不能根据 here 使用 CVPixelBufferCreateWithPlanarBytes 创建
我收到 YUV 帧 (kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange),当从 CVPixelBufferRef 创建 CIImage 时,我得到: in
我是一名优秀的程序员,十分优秀!