iOS 5 + GLKView:如何访问像素 RGB 数据以进行基于颜色的顶点拾取?

2023-11-23

我一直在转换我自己的个人 OGLES 2.0 框架,以利用新的 iOS 5 框架添加的功能GLKit.

在获得令人满意的结果后,我现在希望实现所描述的基于颜色的拾取机制here。为此,您必须访问后台缓冲区以检索触摸的像素 RGBA 值,然后将该值用作顶点/图元/显示对象的唯一标识符。当然,这需要所有顶点/基元/显示对象的临时唯一着色。

我有两个问题,非常感谢您对其中一个问题的帮助:

  1. 我可以访问GLKViewController, GLKView, CAEAGLLayer(的GLKView) 和EAGLContext。我还可以访问所有 OGLES 2.0 缓冲区相关命令。如何组合这些来识别颜色 我在屏幕上点击的 EAGLContext 中的像素?

  2. 鉴于我使用顶点缓冲区对象进行渲染,是否有一种巧妙的方法来覆盖提供给我的顶点着色器的颜色 首先不涉及修改缓冲顶点(颜色) 属性,其次不涉及添加 IF 声明到顶点着色器中?

我认为(2)的答案是“否”,但出于性能和不费力的代码修改的原因,我认为明智的做法是与更有经验的人核实。

如有任何建议,我们将不胜感激。感谢您的时间

UPDATE

好吧,我现在知道如何使用从活动帧缓冲区读取像素数据glReadPixels。所以我想我只需要对后台缓冲区进行特殊的“独特颜色”渲染,短暂切换到它并读取像素,然后切换回来。这不可避免地会产生视觉闪烁,但我想这是最简单的方法;当然比创建一个更快(也更明智)CGImageContextRef从屏幕快照并以这种方式进行分析。

尽管如此,任何有关后台缓冲区的提示都将不胜感激。


好吧,我已经弄清楚如何尽可能简洁地做到这一点。下面我解释如何实现这一点并列出所需的所有代码:)

为了允许触摸交互选择像素,首先添加一个UITapGestureRecognizer给你的GLKViewController子类(假设您想要点击选择像素),并在该类中使用以下目标方法。你必须让你的GLKViewController子类aUIGestureRecognizerDelegate:

@interface GLViewController : GLKViewController <GLKViewDelegate, UIGestureRecognizerDelegate>

实例化手势识别器后,将其添加到view财产(其中在GLKViewController实际上是一个GLKView):

// Inside GLKViewController subclass init/awakeFromNib:
[[self view] addGestureRecognizer:[self tapRecognizer]];
[[self tapRecognizer] setDelegate:self];

设置手势识别器的目标动作;您可以在使用特定的创建它时执行此操作init...然而,我使用 Storyboard(又名“Xcode 4.2 中的新 Interface Builder”)创建了我的,并以这种方式连接它。

无论如何,这是我的点击手势识别器的目标操作:

-(IBAction)onTapGesture:(UIGestureRecognizer*)recognizer {
    const CGPoint loc = [recognizer locationInView:[self view]];
    [self pickAtX:loc.x Y:loc.y];
}

那里调用的 pick 方法是我在我的内部定义的GLKViewController子类:

-(void)pickAtX:(GLuint)x Y:(GLuint)y {
    GLKView *glkView = (GLKView*)[self view];
    UIImage *snapshot = [glkView snapshot];
    [snapshot pickPixelAtX:x Y:y];
}

这利用了一种方便的新方法snapshotApple 善意地将其纳入其中GLKView生产一个UIImage从底层EAGLContext.

值得注意的是评论中的评论snapshotAPI 文档,其中指出:

只要您的应用程序显式地调用此方法 需要视图的内容;切勿尝试直接阅读 使用 OpenGL ES 函数的底层帧缓冲区的内容。

这给了我一个线索,解释为什么我之前尝试调用glReadPixels在尝试访问生成的像素数据EXC_BAD_ACCESS,以及让我走上正确道路的指标。

你会注意到我的pickAtX:Y:刚才定义的方法我称之为pickPixelAtX:Y: on the UIImage。这是我添加的一个方法UIImage在自定义类别中:

@interface UIImage (NDBExtensions)
-(void)pickPixelAtX:(NSUInteger)x Y:(NSUInteger)y;
@end

这是实现;这是所需的最终代码清单。代码来自这个问题并根据那里收到的答复进行了修改:

@implementation UIImage (NDBExtensions)

- (void)pickPixelAtX:(NSUInteger)x Y:(NSUInteger)y {

    CGImageRef cgImage = [self CGImage];
    size_t width = CGImageGetWidth(cgImage);
    size_t height = CGImageGetHeight(cgImage);

    if ((x < width) && (y < height))
    {
        CGDataProviderRef provider = CGImageGetDataProvider(cgImage);
        CFDataRef bitmapData = CGDataProviderCopyData(provider);
        const UInt8* data = CFDataGetBytePtr(bitmapData);
        size_t offset = ((width * y) + x) * 4;
        UInt8 b = data[offset+0];
        UInt8 g = data[offset+1];
        UInt8 r = data[offset+2];
        UInt8 a = data[offset+3];
        CFRelease(bitmapData);
        NSLog(@"R:%i G:%i B:%i A:%i",r,g,b,a);
    }
}

@end

我最初尝试了在 Apple API 文档中找到的一些相关代码,标题为:“从 CGImage 上下文获取像素数据”,它需要 2 个方法定义而不是这 1 个,但是需要更多代码并且存在类型的数据void *对此我无法实施正确的解释。

就是这样!将此代码添加到您的项目中,然后在点击像素时,它将以以下形式输出:

R:24 G:46 B:244 A:255

当然,您应该编写一些方法来提取这些 RGBA int 值(范围为 0 - 255)并根据需要使用它们。一种方法是返回一个UIColor从上面的方法,实例化如下:

UIColor *color = [UIColor colorWithRed:red/255.0f green:green/255.0f blue:blue/255.0f alpha:alpha/255.0f];
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

iOS 5 + GLKView:如何访问像素 RGB 数据以进行基于颜色的顶点拾取? 的相关文章

  • 如何检测位图中的红色像素

    android中的getPixels 是上下左右读取像素 还是左右上下读取像素 基本上是按行或列读取 如果我想知道图片中的红色值较高的位置 我可以这样做吗 我假设它是按列读取的 Bitmap thumbnail Bitmap data ge
  • Facebook的“蓝色”背景色的十六进制代码是什么?

    我想为我的手机应用程序设置背景颜色 例如 Facebook 的蓝色背景颜色 那么它的十六进制代码是什么呢 蓝色主横幅的颜色是 3b5999 用于评论背景的浅蓝色是 eeeff4 解决这个问题的一种方法是抓取屏幕截图并在具有颜色选择器工具的图
  • iPhone 5 屏幕高度错误

    我在 3 5 英寸屏幕上开发了一个应用程序 现在我为 4 英寸屏幕制作了一个新的 Storyboard 我喜欢按照以下方式在 appdelegate 上的 Storyboard 之间切换 我记录了屏幕高度 它给了我 480 00000 检查
  • geom_line 高于和低于特定值的不同颜色

    我有以下要绘制的数据框 我想知道是否可以用不同的颜色对连接结果变量 stackOne y 的线条部分进行着色 具体取决于它是否小于某个值 例如 我希望低于 2 2 的部分线的颜色为红色 set seed 123 stackOne data
  • 在 Mathematica 中创建具有不同颜色边的图形

    我想创建一个图 图论 其中某些边具有与其他边不同的颜色 这将用于突出显示图中从一个顶点到另一个顶点的路径 以下是一些具有不同颜色边缘的示例http demonstrations wolfram com AGraphTheoryInterpr
  • 具有 OpenGL ES 3.1 上下文的 GLSurfaceView

    我正在使用 OpenGL 开发 Android 我知道如何使用GLSurfaceView及其自定义派生类 使用以下方法创建 OpenGL ES 2 0 上下文GLSurfaceView setEGLContextClientVersion
  • Datagridview 的单个单元格中的 C# 多色文本

    是否可以更改 datagridview 单元格中存在的子字符串的颜色 您需要使用细胞绘画 http msdn microsoft com en us library hta8z9sz aspx事件来自定义单元格的绘制方式
  • NSMutableAttributedString 的自动换行

    我有 NSMutableAttributedString 并且字符串很长 我想在 UIlabel 上显示它时进行自动换行 如果是 NSString 我会继续做这样的事情 动态 UILabel 截断文本 https stackoverflow
  • 如何在Python中设置像素的alpha值

    我正在尝试编辑image https drive google com file d 0B8JcwRV HVk0OURrcTFJczhmV2RlUGdMOG0ybldYUVRoamtF view usp sharing以一种将所有白色像素转
  • 设置刻度标签的背景颜色

    我有一个子图 其刻度标签与数据重叠 我想将 x tick 标签设置为具有背景颜色 例如白色 目前我只能找到如何更改标签的颜色 但不能找到背景 我知道如何使用文本对象获得效果 如下所示 注意 我不希望整个子图的边距被着色 而只是刻度标签 MW
  • iPhone 4 iOS 5 电池电量监控我需要将 setBatteryMonitoringEnabled:NO 添加到定期电池检查吗?

    我正在运行一个应用程序 可以在一夜之间对加速度计和陀螺仪数据进行采样 这是一个非常耗电的操作 我想教我的应用程序识别电池何时变低 这是我的原型代码 每 10 分钟检查一次电池电量 NSDate date NSDate date if int
  • 如何随机获得Material Design Color?

    谷歌有他们的颜色 指南 http www google com design spec style color html 那么如何随机接收一个颜色呢 有没有办法指定表中的数字并从表的所有颜色中接收随机颜色 例如getMatColor 100
  • 如何创建热图来说明控制发散调色板中心颜色位置的网格差异?

    我有两个人脸 3D 网格 我希望使用热图来说明差异 我想使用红蓝发散色阶 我的数据可以查到here https github com Patricklv How to create heatmap illustraing 3D mesh d
  • 从时间戳间隔获取缺失的月份

    我从服务器接收时间 以秒为单位 然后使用以下代码将 tjose 秒转换为月份 NSDateFormatter dateFormatter NSDateFormatter alloc init autorelease dateFormatte
  • 如何为十六进制颜色字符串创建独立类型?

    我正在尝试在 TypeScript 中创建一个独立类型 可用于将单个有效的十六进制颜色代码表示为完全类型安全的字符串 我的尝试如下 但由于实际上不是独立类型而未能实现 而这正是我希望实现的目标 type HexDigit
  • 在 Flutter 中更改深色模式的文本颜色(带有动态主题)?

    当我选择深色模式时 文本变成白色 但我想将所有文本设置为白色70或其他内容 包括按钮和常规文本 如何定义深色模式的默认文本颜色 我的主题数据现在是这样的 class MyApp extends StatelessWidget overrid
  • R 编程:创建堆叠条形图,每个堆叠条形具有可变颜色

    我正在尝试创建一个堆叠条形图 每个堆叠条形图中的颜色可变 也就是说 一个条形图在红色上方显示蓝色 下一个条形图在紫色上方显示红色 等等 我还想保留堆叠图表的功能 十分感谢大家 Adam 下图 使用上面的代码创建 显示了主要汽车制造商生产的汽
  • CSS 文本装饰:反向

    我很惊讶 CSS 中没有 text decoration reverse 因为使用 JavaScript 来实现似乎非常尴尬 IE 将元素的前景色和背景色分别设置为父元素的背景色和前景色 我注意到了 JavaScript 技术here ht
  • iOS 中的 FacebookSDK 不显示关闭按钮且无法关闭

    您好 我已经为 iOS 6 应用程序集成了 Facebook SDK Facebook 身份验证和共享工作完美 但没有提供关闭 FB 对话框的规定 当FB对话框打开时 只有在身份验证成功后才会关闭 没有关闭或导航回来的规定 我如何制作关闭按
  • 为 Snow Leopard 安装 Xcode 4.2 失败

    我已经从官方网站下载了 Xcode 4 2 当安装开始时 它显示一个错误 信息不是很丰富 有什么问题吗 哪里可以看到日志什么的 PS 我有 Mac OS 10 6 8 Xcode 4 0 10 GB 可用空间 我只想在 ios5 上测试我的

随机推荐

  • C# 根据硬件 ID 创建唯一 ID [重复]

    这个问题在这里已经有答案了 我正在创建特定于机器的许可证 许可证基于以下项目 MAC地址 CPU序列号 计算机卷驱动器 0 的序列号 我假设如果 3 个匹配中的 2 个匹配 那么我的许可证有效 因此 可以获取新的网卡 并且许可证仍然有效 等
  • 导入错误:没有名为 Bottle 的模块

    sudo pip install bottle Downloading unpacking bottle Downloading bottle 0 10 7 tar gz 55Kb 55Kb downloaded Running setup
  • 此视图不允许“EditItem” - 数据绑定问题

    我正在尝试使用自定义列表在数据网格上的 WPF 中进行数据绑定 我的自定义列表类包含类型的私有数据列表List
  • 绘制到 CGImageRef 中

    我想创建一个 CGImageRef 并绘制指向它的点 使用什么上下文来创建空的 CGImageRef 并能够在其上进行绘制 CGContextRef 还是 CGBitmapContextRef 如果您可以提供代码来创建一个空的 CGImag
  • 如何在 C# 中查找 IIS 站点 ID?

    我正在为我的网络服务编写一个安装程序类 在许多情况下 当我使用 WMI 时 例如 创建虚拟目录时 我必须知道 siteId 才能为站点提供正确的配置数据库路径 例如 metabasePath is of the form IIS
  • Xcode 7.2 成功存档不会显示在管理器中,但会显示在有关派生数据文件夹的存档文件夹中

    我在用Cocoapods 0 39 0 and Xcode 7 2 我有一个项目已成功存档但未填充到管理器中 当我在空白项目中测试我的 podfile 时 存档显示在Organizer正好 在尝试解决此问题时 我发现派生数据上方有一个 Ar
  • 在 Chrome 扩展中,更改发送到特定域的 ajax 请求的引荐来源网址?

    我已经做了一些研究 现在知道在 Google Chrome 中发送带有更改的引荐来源网址的请求是不可能的 因为浏览器将覆盖更改 但是 Google Chrome 扩展中是否有 任何权限可以禁用此功能 或者以便您可以使用不同的引荐来源网址向某
  • 如何自动运行 Office 365 Outlook 加载项

    我正在为 Outlook 创建 Office 365 加载项 我希望我的加载项在用户阅读电子邮件 在阅读窗格中打开它 时自动运行 我当前的版本在邮件正文顶部显示加载项名称 当我单击它时加载项就会运行 Office initialize fu
  • 如何设置 UIImage 的不透明度/alpha?

    我知道你可以用 UIImageView 做到这一点 但是可以对 UIImage 做到这一点吗 我想让 UIImageView 的动画图像数组属性成为相同图像但具有不同不透明度的数组 想法 我只需要这样做 但认为史蒂文的解决方案会很慢 这应该
  • 是否有任何 jquery 功能可以以与 DOM 类似的方式查询多维数组?

    问题说了什么 jQuery 是否有任何方法可以让您以与 DOM 类似的方式查询多维对象数组 例如 获取一个多维数组中包含的对象列表 该数组具有一些匹配的属性值 例如 其中 StartOfPeriod 大于指定日期或 name Ben Ala
  • Objective-C 串口 - Mac OS X

    我目前正在终端中运行以下命令 通过 USB 串行发送命令 Users drummerboyx Library Scripts arduino serial b 9600 p dev tty usbserial A800ev0Z s 1 Ob
  • 使用 AJAX(不是表单)更新 Rails 3 部分

    我发现了一些关于提交表单后使用 Ajax 更新部分内容的问题和答案 但我的问题是 更简单 我只想每隔几秒重新加载一部分并加载新数据 这真的一点也不难 我记得在 Rails 2 3 中做过类似的事情 但我在任何地方都找不到答案 基本上 我有一
  • junit 测试中的 spring-data-jpa bean 验证

    在我最近的工作中 我使用 spring data jpa 来利用提供的存储库 当涉及到集成测试时 我无法配置 我假设 用于测试的 spring 上下文 因此 bean 验证在我的测试中不起作用 我知道我可以注入验证器 并对我的注释进行单元测
  • Oracle 在 DATE 使用 LIKE '%'

    我的桌子myTab有专栏startDate 其数据类型为 DATE 该列中的数据存储方式如下dd mm yyyy 现在我尝试使用此查询获取数据 SELECT FROM myTab WHERE startDate like 01 2015 不
  • 如何在Tlistview中基于subitem[x]排序

    如何排序tlistview数据存在于subitem x Set SortType stData和写 procedure TForm1 ListView1Compare Sender TObject Item1 Item2 TListItem
  • 无法在 PyQt5 中导入 QtWebKitWidgets

    我最近使用 Windows 32 位安装程序将 PyQt5 从 5 5 1 升级到 5 6 0 https www riverbankcomputing com software pyqt download5 我还将我的 python 从
  • Android 音频 SeekBar

    我正在尝试创建一个可以播放单个音频文件并且可以使用进度 搜索栏暂停和操作的东西 我想要一个图像占据大部分屏幕 然后在左下角有一个播放暂停按钮 在按钮右侧有一个栏 一切都在搜索栏上运行 但未链接到音频 我的进度条编码可能是一团糟 因为如果从我
  • 将多个域添加到 azure 网站

    我正在将一个相当重要的多租户应用程序迁移到 Azure 我看到的挑战之一是它托管着一百多个域 在 Azure 方面 我认为添加自定义域的唯一方法是通过门户手动输入它们 我真的很想使用 Azure PowerShell 或 对于这种一次性操作
  • 如何获取 Win32 中的 CPU 周期数?

    在 Win32 中 有没有办法获得唯一的 cpu 周期计数或类似的东西 对于多个进程 语言 系统 等来说是统一的 我正在创建一些日志文件 但必须生成多个日志文件 因为我们托管 NET 运行时 并且我希望避免从一个日志文件调用另一个日志文件来
  • iOS 5 + GLKView:如何访问像素 RGB 数据以进行基于颜色的顶点拾取?

    我一直在转换我自己的个人 OGLES 2 0 框架 以利用新的 iOS 5 框架添加的功能GLKit 在获得令人满意的结果后 我现在希望实现所描述的基于颜色的拾取机制here 为此 您必须访问后台缓冲区以检索触摸的像素 RGBA 值 然后将