跳到正文
PS5PCEM
部分可用图形

NGG 顶点着色器

合并后的 NGG 顶点程序,包括以 S_SETPC_B64 继续的 fetch 着色器,作为一个图形阶段来翻译。导出程序保留自己的用户数据窗口。

仓库笔记截至 2026年10月10日

fetch 与导出是不同的程序

PlayStation 5 的绘制常常把顶点工作拆成 fetch 着色器和导出着色器。fetch 着色器用 S_SETPC_B64 跳到导出代码,以此结束它的属性前导。PS5PCEM 把这次继续当作同一个顶点程序的一部分,并翻译合并后的结果。

NGG 导出程序不借用几何着色器的用户数据组。它的标量寄存器从自己的用户数据快照初始化,导出程序从 s8 开始。假定资源表住在 s0:s1 是翻译器特意避免的错误。表指针来自元数据所声明的 ShaderResourceTable user-SGPR 对。

顶点属性

fetch 着色器与扩展用户数据,会和内嵌的顶点缓冲区表、顶点属性表一起解析。最多 32 个输入语义保留它们的语义索引、落入的硬件 VGPR、AGC 属性格式、字节偏移、实例速率,以及 128 位缓冲区描述符。

属性查找使用语义字节,而不是硬件映射字节。不完整的表对,或超出受支持域的索引,会在任何客户机读取之前被拒绝。顶点阶段的 PARAM 导出变成片元插值输入,后面的像素着色器由此看到这些插值量。

调用进 fetch 着色器

当调用的用户数据对仍然持有 AGC 所注册的地址时,经过验证的外部 fetch 着色器也可以从 S_SWAPPC_B64 或 S_CALL_B64 链接进来。fetch 函数体一直解码到它返回用的 S_SETPC_B64,而这次返回必须读取调用者的链接对。哪些调用合法,细节在标量调用那一页。

合并后的 NGG 翻译让三维场景能够越过过去会停住解码器的 fetch 前导。它本身并不补上缺失的像素着色器或缺失的渲染目标。

已经实现的部分

  • 合并后的 NGG 顶点程序,包括以 S_SETPC_B64 结束的 fetch 前导。
  • 导出程序单独的用户数据窗口。
  • 最多 32 个顶点语义,带格式、偏移、实例速率和缓冲区描述符。
  • 连接到片元插值输入的 PARAM 导出。

尚未实现的部分

  • 返回与调用者链接对不匹配的 fetch 着色器不会被链接。
  • 一般的动态调用仍然不受支持。见标量调用。
  • 依赖不受支持的导出或插值量的几何,该次绘制仍然失败。

相关机制

这些页面说明什么

文字依据 PS5PCEM 仓库中的架构说明和 2026 年 10 月的报告。单项测试通过并不等于新的帧率,也不等于新的通关。

全部技术