Overview

在 WWDC 2014 上,Apple 为游戏开发者推出了新的图形技术 Metal。Metal 是一种用 C++ 编写的 low-level API。 它代表了 Apple 最新的图形 API 设计。与 OpenGL 不同的是,Metal 不像 OpenGL 那样是跨平台的,它是根据 Apple 最新硬件架构专门设计的 API,因此它能够为 3D 图形提高最多10倍的渲染性能。由于 Apple 声称将弃用 OpenGL,为此 V4 对 Renderer 做了适配,对于 Apple 平台,使用 Metal api 进行渲染,否则,沿用原 OpenGL ES API 渲染。

How to run

  • mac: use cocos command or CMake
  • iOS: use CMake to generate Xcode project, then run
  • Android: use cocos command or Android Studio
  • windows: use cocos command or CMake
  • linux: use cocos command or CMakeCMake的使用教程可以参考CMake 指南

改动点

更详细的接口变化,请参考API 改动

Director

  • 移除了以下接口
  1. CC_DEPRECATED_ATTRIBUTE static Director* sharedDirector();
  2. void setAlphaBlending(bool on);
  3. void setDepthTest(bool on);
  4. void pushProjectionMatrix(size_t index);
  5. void popProjectionMatrix(size_t index);
  6. void loadProjectionIdentityMatrix(size_t index);
  7. void loadProjectionMatrix(const Mat4& mat, size_t index);
  8. void multiplyProjectionMatrix(const Mat4& mat, size_t index);
  9. const Mat4& getProjectionMatrix(size_t index) const;
  10. void initProjectionMatrixStack(size_t stackCount);
  11. size_t getProjectionMatrixStackSize();
  • 移除了 void setDepthTest(bool on) 接口,通过 Director::getInstance()->getRenderer()->setDepthTest(true) 设置。

Renderer

在 Renderer 下添加了 backend 层,其中与 Metal 相关的适配文件统统放在了 metal 文件夹下,与 OpenGL ES 渲染相关的文件都放在 opengl 文件夹。原则上,除了 metal 和 opengl 这两个文件夹下的源码之外,不允许直接使用任何平台下的图形 API。

  1. renderer
  2. CCxxx.h
  3. CCxxx.cpp
  4. | ...
  5. └───backend
  6. file011.h
  7. file011.cpp
  8. ...
  9. └───metal
  10. filexxxMTL.h
  11. filexxxMTL.mm
  12. ...
  13. └───opengl
  14. filexxxGL.h
  15. filexxxGL.cpp
  16. ...
  17. └───shaders
  18. xxx.vert
  19. xxx.frag
  20. ...
  21. CMakeLists.txt

Shader 及 Program

移除了 GLProgramState 和 GLProgram,新增了 backend::ProgramState。范例1范例2 演示了如何创建和使用 backend::ProgramState。

Metal 使用 MSL 作为 shader 开发语言。为了支持 OpenGL ES shader 运行在 Metal 框架上,V4 采用 glsl-optimizer 将 OpenGL ES shader 转换成 Metal MSL shader。

V4 将原来存放在 renderer/路径下以 "ccShader" 开头的 shader 文件移到 renderer/shaders/ 路径下,除了将shader 文件名稍作修改外(删除了ccShader),在 shader 文件中显式声明 uniform 和 texture,不在使用 GLProgram 中预定义的 attribute,uniform 及 texutre 名。

Texture2D

  • 移除 Texture2D::PixelFormat,统一使用 Types.h 下的 backend::PixelFormat

  • 移除源码中使用 OpenGL ES API 情况。

  • 移除了 convertXXX,统一使用 CCTextureUtils.h 下的 convertXXX 接口。

  • 移除了以下接口

  1. CC_DEPRECATED_ATTRIBUTE const char* stringForFormat() const;
  2. CC_DEPRECATED_ATTRIBUTE unsigned int bitsPerPixelForFormat() const;
  3. CC_DEPRECATED_ATTRIBUTE unsigned int bitsPerPixelForFormat(Texture2D::PixelFormat format) const;
  4. GLuint getName() const;
  5. void setGLProgram(GLProgram* program);
  6. GLProgram* getGLProgram() const;
  • 新增了如下接口,用于设置 render texture。
  1. bool initWithBackendTexture(backend::TextureBackend* texture);
  2. void setRenderTarget(bool renderTarget);
  3. inline bool isRenderTarget() const;
  • 移除了 opengl texture object(GLuint _name ),改用 backend::Texture2DBackend* _texture 作为纹理对象。

TO be continue…