N64 编程/视频协处理器
RCP(VDP、PPU、视频控制器)主要对多边形压缩和后期滤镜效果感兴趣。
由两个组件组成 - RSP(现实信号处理器)和 RDP(现实绘制处理器)。
纹理缓存和帧缓冲区与 CPU 共享在 RDRAM 中。
实际的纹理内存只有 4KB——一次只允许处理这么多内存。
RSP 是您的变换和光照单元 (TnL)。它操作世界数据和纹理。
在数学上,很多矩阵用来从本地数据-> 世界空间-> 视图空间(带有 z 透视校正的投影)。
变换意味着对多边形、光照法线和纹理 UV 进行缩放、平移和旋转。
为 RDP 创建三角形和线条的图元列表以渲染。
RDP 是显示单元。
光栅化、雾化、环境、颜色混合。抗锯齿效果。
更低级的像素处理程序。
RCP 有自己的语言,称为“uCodes”(256 个微码)。
想想来自 OpenGL 的现代顶点和片段着色器,或者来自 Direct3D 的顶点和像素着色器 - 两个阶段组合在一起。
R4000 协处理器(COP2)。每个 uCode 都是由 RSP 运行的一串 ASM 指令。它还设置 RDP 批量渲染器。
显示列表是由游戏定义的一系列 uCode。它被馈送到 RSP。
注意:模拟器作者选择将 uCode 翻译成更高级别的语言。
程序员可以定义自己的顶点/纹理格式。光照方法。过渡检测和其他灵活的魔法。
微码在运行时上传到 RCP。因此,每个游戏都有自己的绘制函数库(有些类似于 DSP1 -> DSP1A -> DSP1B,而另一些则类似于 DSP2、DSP3)。
游戏使用自定义格式。此外,线性位图可以是任何尺寸(320x8、48x13)。4/8/16/32-bpp 是标准。
微码库倾向于定义几个“可接受的”格式。
这是来自视频插件作者的示例列表。
- 16 位 RGBA = 5551。红色、绿色、蓝色、alpha(透明度)。
- 32 位 RGBA = 8888。
- 4 位 IA = 31。灰度强度(亮度、亮度)+ alpha。
- 8 位 IA = 44。
- 16 位 IA = 88。
- 4 位 I = 40。仅灰度。
- 8 位 I = 80。灰度。
- 16 位 I = (16)(0)。
- 4 位 CI = 40。调色板查找 -> 16 位 RGBA 或 16 位 IA。
- 8 位 CI = 80。调色板查找 -> 16 位 RGBA 或 16 位 IA。
YUV = 其他一些颜色格式。输出为 RGB(888)+ 全透明度。