关于cocos gfx api设计的疑问?

近些年,cocos gfx api接入的越来越多。web端有webgl1/webgl2. 原生端有gles/vulkan/metal。暂不知道当前cocos gfx api在设计的时候是否遵循某一规则。但一定会遇到某API支持,某API不支持,某API可以通过某种方式支持。

比如说个最简单的API兼容性问题。
我们先看创建纹理的webgl1实现:
WebGLCmdFuncCreateTexture

我们再看webgl2创建纹理的实现:
WebGL2CmdFuncCreateTexture

在webgl1上由于没有texStorage2D但是webgl2有。
此时cocos gfx api是怎么设计的呢?是在webgl2上使用了texStorage2D,但是webgl1没有API就没有用。这本身并没有问题。但是由于texStorage2D带来的不可变纹理会导致在webgl1上某些功能可用,但是切换到webgl2就不可用的巨大不可逆兼容性问题。这显然不是合理的API设计。

合理的API设计是什么肯定没有一概而论的官方答案。但是保证用户使用API的最低兼容性是基本功能。类似的设计是否是向下兼容webgl1而不是兼容webgl2更好呢?

这里的实现应该是API行为默认使用不可变纹理。但需要支持传递参数以便支持可变纹理。即在参数控制下可以在webgl2后端采用texImage2D而非texStorage2D。

当然我在做原生/H5游戏的过程中,除开gfx api有这些问题外,其他的API也有类似问题。

当然这种问题可能还有很多,暂不阐述。希望cocos在vulkan/opengl/dx/metal/gles/webgl/webgl2/webgpu加入cocos gfx 实现后的render hardware interface的实现上越发需要考虑周全。

1赞

我看我们项目跑的现在一直都是webGL1的 :joy: