首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将IOSurface绘制到OpenGL上下文

将IOSurface绘制到OpenGL上下文
EN

Stack Overflow用户
提问于 2014-02-27 18:43:08
回答 1查看 3.1K关注 0票数 0

我有一个使用OpenGL成功绘制的OpenGL上下文。

我需要为这个上下文绘制一个IOSurface的特定矩形。

在10.8上做这件事的最好方法是什么?

注意:我知道如何在10.9上使用CoreImage (通过从IOSurface创建一个CIImage,并使用[CIContext drawImage:inRect:fromRect]来呈现它)。但是,在10.8上,这并不适用于我(图像的每个原始数据都以不同的偏移量显示,图像是对角扭曲的)。

编辑:这里是在10.9上工作的代码,而不是10.8上的代码:

代码语言:javascript
复制
CGColorSpaceRef colorSpace = CGColorSpaceCreateWithName(kCGColorSpaceSRGB);

CIImage* ciImage = [[CIImage alloc] initWithIOSurface:surface plane:0 format:kCVPixelFormatType_32BGRA options:@{kCIImageColorSpace : (__bridge id)colorSpace}];
NSRect flippedFromRect = fromRect;
// Flip rect before passing to CoreImage:
{
  flippedFromRect.origin.y = IOSurfaceGetHeight(surface) - fromRect.origin.y - fromRect.size.height;
}
[ciContext drawImage:ciImage inRect:inRect fromRect:flippedFromRect];


CGColorSpaceRelease(colorSpace);
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-02-27 21:55:04

以下是通过使用IOSurface纹理包装OpenGL并将纹理绘制到屏幕上的解决方案。这假设一个与[CIContext render:toIOSurface:bounds:colorSpace:]相似的API,但是垂直翻转的OpenGL坐标系。

代码语言:javascript
复制
  // Draw surface on OpenGL context
  {
    // Enable the rectangle texture extenstion
    glEnable(GL_TEXTURE_RECTANGLE_EXT);
    
    // 1. Create a texture from the IOSurface
    GLuint name;
    {
      CGLContextObj cgl_ctx = ...

      glGenTextures(1, &name);
      GLsizei surface_w = (GLsizei)IOSurfaceGetWidth(surface);
      GLsizei surface_h = (GLsizei)IOSurfaceGetHeight(surface);
      
      glBindTexture(GL_TEXTURE_RECTANGLE_EXT, name);
      
      CGLError cglError =
      CGLTexImageIOSurface2D(cgl_ctx, GL_TEXTURE_RECTANGLE_EXT, GL_RGBA, surface_w, surface_h, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, surface, 0);
      
      glBindTexture(GL_TEXTURE_RECTANGLE_EXT, 0);          
    }
    
    // 2. Draw the texture to the current OpenGL context
    {
      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(0.f, 0.f, 1.0f, 1.0f);
      glTexCoord2f(   (float)NSMinX(fromRect),    (float)(NSMinY(fromRect)));
      glVertex2f(     (float)NSMinX(inRect),      (float)(NSMinY(inRect)));
      
      glTexCoord2f(   (float)NSMaxX(fromRect),    (float)NSMinY(fromRect));
      glVertex2f(     (float)NSMaxX(inRect),      (float)NSMinY(inRect));

      glTexCoord2f(   (float)NSMaxX(fromRect),    (float)NSMaxY(fromRect));
      glVertex2f(     (float)NSMaxX(inRect),      (float)NSMaxY(inRect));
      
      glTexCoord2f(   (float)NSMinX(fromRect),    (float)NSMaxY(fromRect));
      glVertex2f(     (float)NSMinX(inRect),      (float)NSMaxY(inRect));
      
      glEnd();
      
      glBindTexture(GL_TEXTURE_RECTANGLE_EXT, 0);
    }
    glDeleteTextures(1, &name);
  }

如果需要绘制显示器的颜色配置文件,可以显式调用ColorSync并将其传递给您的源配置文件和目标配置文件。它将返回给你一个“食谱”来执行颜色校正。该配方实际上有线性化,颜色转换( 3x3转换矩阵)和伽马。

代码语言:javascript
复制
FragmentInfo = ColorSyncTransformCopyProperty (transform, kColorSyncTransformFullConversionData, NULL);

如果您愿意,可以将所有这些操作组合到一个3D查找表中。这实际上是在许多OS框架和应用程序的颜色管理中发生的。

参考文献:

  1. 苹果TextureUpload示例代码
  2. 将IOSurfaces绘制到另一个IOSurface
  3. 高级色彩管理的OpenGL选项
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22077544

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档