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 数据以进行基于颜色的顶点拾取? 的相关文章

  • 将子视图发送到后面

    我正在尝试模仿 facebook ios 侧面菜单并让它工作 但是我遇到的问题是我无法将侧面菜单发送到后面 正如另一个问题中所讨论的那样使用 Objective C 的 iphone facebook 侧边菜单 https stackove
  • 从 RemoteIO 录制到 AAC:数据正在写入,但文件无法播放

    我一直在尝试从 iPad 2 上的 iOS 5 中的 renderCallback 中直接从 RemoteIO 单元录制到 AAC 我看到了相互矛盾的信息 说这是不可能的 但这是可能的 在评论中 here http atastypixel
  • 禁用按钮上的实际文本颜色

    VB2012 我正在创建一个按钮控件并继承自 NET 按钮 从这里夺取基地https blogs msdn microsoft com jfoscoding 2005 11 10 building a splitbutton https b
  • 在java中将jpeg/png转换为像素数组

    如何将包含 jpeg 或 png 的字符串转换为像素数组 最好是一维 理想情况下使用java内置的类 原来你需要公共文件上传 http commons apache org fileupload 看着那 这用户指南 http commons
  • 将 RGB 转换为灰度/强度

    当从 RGB 转换为灰度时 据说应该对 R G 和 B 通道应用特定的权重 这些权重是 0 2989 0 5870 0 1140 据说这是因为人类对这三种颜色的感知 感受不同 有时也有人说这些是用于计算 NTSC 信号的值 但是 我在网上没
  • 翻转通过CVOpenGLESTexture获得的OpenGL ES纹理

    在我尝试 OpenGL ES 2 0 的最后一天 当我尝试将两个投影纹理 一个精灵动画和一个视频文件纹理 应用到天空盒时 我开始像存根一样简单地用手敲击键盘 奇迹般地它就成功了 一切都开始工作了 然而 从视频文件创建的纹理是颠倒的 换句话说
  • iOS 5 Twitter 框架和completionHandler 块 - “在此块中强烈捕获‘自我’可能会导致保留周期”

    我对编程和 Objective C 非常陌生 我正在尝试找出我的代码出了什么问题 我已经阅读了一些有关块的内容 但我不知道到目前为止我所阅读的内容与我的代码有何相关 我的代码使用 iOS 5 Twitter 框架 我使用了 Apple 提供
  • 我可以混合 UITableViewDelegate 的 didSelectRowAtIndexPath: 吗?

    问题是这样的 我需要能够在具有大量表视图的大型现有应用程序中获取 didSelectRowAtIndexPath 的分析 我的第一个想法是在 didSelectRowAtIndexPath 上进行方法调整 但是我的应用程序崩溃并显示 无法识
  • Mercurial 颜色扩展的有效颜色是什么?

    水星的color 扩大 http mercurial selenic com wiki ColorExtension很棒 但是该页面上没有有效颜色的列表 我寻找了一个名为 color 的 python 文件 希望能够阅读源代码并在那里看到它
  • iPhone glShader二进制

    有谁有如何编译着色器 保存着色器二进制文件以及使用 glShaderBinary 稍后使用 iPhone iOS OpenGL ES 2 0 加载着色器的示例 这是不可能的 至少对于 iOS 4 及更低版本 iOS 不支持任何预编译的二进制
  • 带伽玛参数的渐变色阶?

    我有一些对比度非常微弱且有相当多噪声的成像数据 当我用线性色阶显示它时 它显示得不好 在 imageJ 或 Photoshop 等成像软件中 有一条色调曲线 人们可以调整该曲线以非线性方式提高对比度 并有效地拉伸某些感兴趣区域的比例以查看更
  • iOS 5:UIImagePickerController 崩溃

    我面临的问题是UIImagePickerController在 iOS 5 中 我的应用程序开发于iOS4 3但现在我将其升级为iOS5 当我尝试从照片库中选择图像时 我的应用程序崩溃了 它在 main m 文件中崩溃EXE BAD ACC
  • 给定背景颜色,如何获得使其在该背景颜色上可读的前景色?

    给定背景颜色 如何获得使其在该背景颜色上可读的前景色 我的意思是在程序中自动计算前景色 或者简化问题 如果前景色是从白色 黑色中选择的 那么在程序中如何进行选择呢 这是我用 Java 和 Javascript 做的一个 它是松散地基于thi
  • 在采取行动之前如何知道几个块是否已经执行完毕?

    我在用着animateWithDuration animations completion 之前移动用户界面的几个元素 大约 4 个元素 removeFromSuperview 叫做 我的问题是 我怎么知道在调用之前所有这些动画都已完成re
  • 如何在 Android 中获取像素颜色

    我正在使用 Intent 调用并显示图库中的图像 现在我可以使用以下命令在 TextView 中获取图像的坐标 final TextView textView TextView findViewById R id textView fina
  • Pygame 中可以改变精灵颜色吗?

    我正在使用 Pygame 在 Python 中制作一个游戏 其中在游戏开始前包括一个小型头像制作器 但不是创建一个包含 88 种不同发型和颜色组合的大精灵表 有没有一种方法可以让我只使用通用的 每个发型的 png 图像并在游戏中为其应用颜色
  • 更改焦点上可点击的 TextView 颜色并点击?

    我有一个可点击的 TextView 我想给它一些颜色 但我不知道怎么办 以下是我正在使用的两个文件中的相关代码片段 TextView title new TextView this title setLayoutParams new Lay
  • 如何使用 Robot Framework 在控制台输出中添加颜色

    我想在 RobotFramework 的控制台输出中添加一些颜色 我尝试使用控制台颜色代码 例如 message Set Variable hello world Log To Console e 0 36 49m message e 0
  • Java-创建离散彩虹颜色数组

    很难描述我想要做什么 我基本上想创建一个离散的彩虹渐变 这样对于 i 个 JButton 的任何一行 它们之间的颜色渐变都会看起来彩虹 我已经完成了以下操作 但它实际上只创建了一个红色渐变 然后是绿色渐变 然后是蓝色渐变 Color c n
  • 确定最接近的已知颜色

    我允许我的应用程序的用户选择自定义颜色 并希望有一种方法来显示每种颜色的友好名称 而不是显示十六进制代码的文本表示形式 我如何找到最近的System Drawing Color对于给定的十六进制代码 希望这对某人有帮助 Public Fun

随机推荐

  • 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 值 然后将