CPU 如何向 (GPU) 高效、准确地下达指令?
答案在于理解它们的指挥体系与内部执行流程
“CPU”需要向“GPU”传递哪些“数据”和“指令”?
兔子的外观?
对兔子进行哪些处理?
整个图形体系结构,就是为了高效地传递数据和对数据的操作。
一个分工明确的“流水线”
负责场景管理、物理、AI等,“决定”要画什么,并准备好所有数据
连接CPU和GPU的桥梁。将高级指令翻译成GPU能懂的底层指令,解决软硬件兼容性问题
接收指令和数据,通过内部固化的硬件流水线执行实际的绘制工作
GPU内部对数据的处理流程
① 顶点输入: “原材料”进场 (顶点数据)
↓
② 顶点着色器 (Vertex Shader): 可编程 - 决定顶点在哪
↓
③ 光栅化 (Rasterization): 固定功能 - 决定覆盖哪些像素
↓
④ 片元着色器 (Fragment Shader): 可编程 - 决定像素是什么颜色
↓
⑤ 帧缓冲操作: 最后处理,写入显存
我们通过OpenGL API,主要就是为了控制这两个可编程阶段。
光栅化
片元处理
//定义对象类型
glBegin(GL_POLYGON);
//定义顶点坐标位置
glVertex3f(0.0f, 0.0f, 0.0f);
glVertex3f(0.0f, 1.0f, 0.0f);
glVertex3f(0.0f, 0.0f, 1.0f);
glEnd();//结束定义
根据不同参数绘制不同类型的对象,数据在CPU中处理后,再通过管线传递给图形硬件(GPU)
var points = new Float32Array([
0.0f, 0.0f, 0.0f,
0.0f, 1.0f, 0.0f,
0.0f, 0.0f, 1.0f
]);
将几何顶点存放在数组中,将数组传递给GPU,由GPU负责渲染,渲染结果为三角形
API中需要指定的相机参数包括:
请将“任务”分配给最适合执行它的“组件”
任务 | 组件 |
---|---|
响应用户输入,更新游戏角色位置 | CPU (应用层) |
翻译高级指令,管理硬件兼容性 | 图形 API |
将模型的3D坐标转为屏幕2D坐标 | GPU (顶点着色器) |
根据光照,计算一个像素的最终颜色 | GPU (片元着色器) |