【问题标题】:Testing point in the alpha channelAlpha 通道中的测试点
【发布时间】:2011-05-06 11:09:27
【问题描述】:

在iphone上使用OpenGLES时,有没有办法检测绘制后像素的alpha是否不为0?

我想测试多个点以查看它们是否位于用户绘制的随机多边形区域内。如果您了解 Flash,我正在寻找类似于 BitmapData::getPixel32 的东西。

【问题讨论】:

  • BitmapData::getPixel32 不返回 alpha 通道值吗?
  • getPixel32 返回一个像素的完整 ARGB 值。从中您可以检测该像素上是否有东西。

标签: iphone flash opengl-es alpha


【解决方案1】:

帧缓冲区由 GPU 保存,CPU 无法立即访问。我认为你最有可能从完整的 OpenGL 中得到的是遮挡查询。您可以请求绘制几何图形并被告知实际绘制了多少像素。遗憾的是,这在 iPhone 上不可用。

我认为您可能想要的是 glReadPixels,如果您愿意,可以使用它来读取单个像素,例如(写在这里,当我打字时,未测试)

GLubyte pixelValue[4];
glReadPixels(x, y, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, pixelValue);

NSLog(@"alpha was %d", pixelValue[3]);

使用 glReadPixels 会导致管道刷新,因此从 GL 性能的角度来看通常是一个坏主意,但它会做你想做的事。与 iOS 不同的是,OpenGL 使用坐标纸顺序来表示像素坐标,所以 (0, 0) 是左下角。

【讨论】:

  • 它确实有效,但它也极大地影响了性能。我试图一次加载所有像素,但它仍然很慢。有没有办法只使用 Alpha 通道来加快速度?
  • 我随后发现您可以将 GL_ALPHA 指定为格式而不是 GL_RGBA 并且只返回该通道。我不确定它会对性能产生多大影响——它调用 glReadPixels 是个问题。如果您要进行多项测试,我认为使用 glReadPixels 一次抓取整个显示器会更快,然后从中检查 alpha 值。
猜你喜欢
  • 2011-02-04
  • 1970-01-01
  • 2010-11-29
  • 1970-01-01
  • 2012-04-24
  • 1970-01-01
  • 2012-02-03
  • 2011-06-11
  • 2012-11-30
相关资源
最近更新 更多