PS4 的图形 API 分两种,自有标准的 GNM 和 GNMX,前者更为接近底层,类似 Vulkan 和 DX 12,能够更为充分的调动硬件机能,同时也意味着开发难度更大;后者层级较高,开发效率上较 GNM 有一定优势,当然表现在实际执行效率上可能逊于 GNM。这也可以解释为何 Sony 本社开发的游戏在利用硬件平台机能上有一定优势:因为愿意花费大量的时间、人工和开支。
前面提到类似 Vulkan/DX 12 指的是 API 接近硬件底层,实际上 GNM/GNMX 结合了 DX 11.4+/OpenGL 4.4 以及 SCE 自行开发的部分指令集扩展。
Shading Language 则是 PSSL,以及配合 CPU 部分使用的 C++11 CPU Compiler 。PSSL 支持较新的 Vertex 与 Pixel Shaders、Geometry Shaders、HS DS Tessellatio、Modern Compute Shaders。遵循 PC 平台 ANSI C style syntax,支持向量、标准库、C++ Style Structs with Members、Static and Dynamic Control Flow。此外还有 SCE 自己提供的各种系统库和开发套件负责解码、输入输出、网络等方面。SDK 以 LLVM 和 Clang 为基础。
2013 年的开发文档预览里给出了 Vertex Shaders 的示例:
struct VS_INPUT { float3 Position float3 Normal float4 Tangent float2 TextureUV : POSITION; : NORMAL; : TEXCOORD0; : TEXCOORD1; }; VS_OUTPUT main( VS_INPUT input ) { VS_OUTPUT Output; Output.Position = mul( float4(input.Position.xyz,1), m_modelViewProjection ); ... float3 vN = normalize(mul(float4(input.Normal,0), m_modelView).xyz); ... return Output; }
以及 Pixel Shaders:
SamplerState samp0 : register(s0); Texture2D colorMap : register( t0 ); Texture2D bumpGlossMap : register( t1 ); float4 main( VS_OUTPUT In ) : S_TARGET_OUTPUT { ... float4 diff_col = colorMap.Sample(samp0, In.TextureUV.xy); float3 spec_col = 0.4*normalGloss.w+0.1; ... return float4(vLight.xyz, diff_col.a); }
此外开发文档预览还指出 PS4 的开发支持 Visual Studio。
PS3 同样有两种 API:较低层级的 LibGCM 与特征接近 OpenGL 的 PSGL。PSGL 以 OpenGL ES 1.1 和部分 SCE 自有标准的指令集为基础构建。两种 API 均以 NVIDIA Cg 为 Shading Language。可能是较低的内存和显存容量所致,PS3 时代的开发人员更为青睐 LibGCM 以提高游戏运行效率。
PSGL 最早可追朔到 PS2 时代,不过没多少人用。
由于 PS 系列主机详细开发文档仅对注册开发者开放,以及 NDA 限制,详细内容无法得知。上述内容肯定与实际情况有相当的出入。所以如果觉得回答似乎言之有物的话就点击“感谢”而不是旁边向上的箭头以免误人子弟......吧?
参考资料:
ICE Team, AMD & Other Devs Discuss API's - Sony's LibGCM First Modern Low Level API?