当前位置: 华文问答 > 游戏

Sony和Nintendo系游戏主机的软件开发基于什么图形库?

2017-02-04游戏

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?

PS3: Introduction to GCM

PlayStation Shading Language for PS4