我正在研究 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 不使用该技术,因为:
从本质上讲,遍历整个纹理而不渲染 0 alpha 像素而不是专注于仅查找、存储和渲染可见像素要容易和快捷得多。
关于ios - Cocos2d 2.0 : vertices and sprites ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11914117/