1

我正在从这个很酷的 raywenderlich 教程中学习 OpenGL ES 2.0 着色器,我想知道为什么说 Sprite 有 4 个顶点。是否有超过 4 个顶点的情况?

我知道这听起来很傻,但我希望它必须有尽可能多的顶点才能形成精灵可见部分的边界。换句话说,我认为 alpha 通道是一种分隔精灵的方法。

然后我检查了我的游戏中的子弹碰撞方法(我使用了一个模板开始它),它们使用了精灵边界框。方框意味着四个顶点:),所以我不应该感到惊讶。但是,我仍然期待 Cocos2D 有一种方法来检测不可见像素。

任何人都可以帮我澄清一下吗?是否有更多方法可以进行仅检测可见像素的子弹碰撞检测?[我找到了一些答案,但没有被接受,而且似乎需要很多步骤,我认为可能有一个内置的 Cococs2d 方法]。

或者这是我在 OpenGL ES 2.0 中学习了着色器之后必须弄清楚的事情吗?

4

1 回答 1

4

精灵是显示在屏幕上的纹理,具有缩放、旋转、位置、颜色等属性。

纹理是矩形,因为它们是内存中的图像。要绘制一个矩形,您需要 4 个顶点。从历史上看,GPU 仅适用于二次方、二次方纹理,因为这是在硬件中实现的最简单的方法。后来的纹理可以是任何矩形,在更现代的 iOS 设备(我认为是 iPhone 3GS)上,您还可以使用 NPOT 纹理(非 2 的幂)。但总的来说,纹理是并且将永远是矩形的。

为了使纹理部分透明,它有一个 Alpha 通道。这就像 3 个 RGB 通道之一,只是它控制像素的透明度。在某些纹理格式中,Alpha 通道仅存储打开或关闭(1 位 Alpha)。

因此,当 GPU 将纹理渲染到屏幕上时,所有关联 alpha 值为 0 的像素都不会被绘制,从而允许背景像素显示出来。

跟踪图像的可见部分以获取碰撞多边形需要运行相对复杂的算法。例如 PhysicsEditor 采用这种机制从图像中生成物理碰撞信息(参见 0:15 的视频)。

GPU 不使用该技术,因为:

  • 初始追踪成本高昂
  • 生成的多边形会很复杂(100+ 个顶点)
  • 根据图像的不同,多边形的复杂性会有很大差异,这使得优化渲染变得困难

从本质上讲,遍历整个纹理而不渲染 0 alpha 像素而不是专注于仅查找、存储和渲染可见像素要容易和快捷得多。

于 2012-08-11T13:28:28.857 回答