ios - Cocos2d 2.0 : vertices and sprites

标签 ios cocos2d-iphone sprite shader alpha

我正在研究 this cool raywenderlich tutorials 的 OpenGL ES 2.0 着色器我想知道为什么说 Sprite 有 4 个顶点。 是否有超过 4 个顶点的情况?

我知道这听起来很傻,但我期待它必须有 形成可见部分的边界所需的尽可能多的顶点的 Sprite 。换句话说,我认为 alpha channel 是一种分隔 Sprite 的方法。

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

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

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

最佳答案

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

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

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

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

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

GPU 不使用该技术,因为:

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

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

    关于ios - Cocos2d 2.0 : vertices and sprites ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11914117/

    相关文章:

    ios - 在状态栏设置为隐藏时检测点击状态栏

    iOS - 应用商店版本与本地安装版本的行为不同

    ios - glReadPixel 停止使用 iOS6 Beta

    css - 动画响应式 Css Sprite

    c# - 在 XNA 应用程序中移动单个 Sprite 时卡顿

    ios - Swift:当图像文件存在于 Assets 中时,为什么它是 nil NSData?

    ios - setContentOffset 没有将表格滚动到最后一个单元格

    iphone - 为什么我的 Sprite 在第一次移动后会转到错误的坐标?

    objective-c - 如何在objective-c中每秒调用一次方法

    objective-c - 让 Sprite 在屏幕上随机移动