困惑
什么是OpenGL、DirectX
如果开发者直接访问GPU是一件非常麻烦的事情,我们可能需要和各种寄存器、显存打交道。
而图像编程接口再这些硬件的基础上实现了一层抽象。
OpenGL和DirectX就是这些图像应用编程接口。
这些接口架起了上层应用和低层GPU的沟通桥梁。
一个应用程序向这些接口发送渲染命令,而这些接口会依次向显卡驱动发送渲染命令,这些显卡驱动是真正知道如何和GPU通信的角色,正是它们把OpenGL或者DirectX的函数调用翻译成了GPU能够听得语言,同时它们也负责把纹理等数据转换成GPU所支持得格式。
HLSL、GLSL、CG
它们是着色器语言
着色器语言是专门用于编写着色器的
这些语言会被编译成与机器语言无关的汇编语言,也被称为中间语言。
这些中间语言再交给显卡驱动来翻译成真正的机器语言,即GPU可以理解的语言。
GLSL 跨平台性
也由于OpenGL没有提供着色器编译器,而是由显卡驱动来完成着色器的编译工作。
GLSL是依赖硬件,而非操作系统层级的。
HLSL
HLSL是由微软控制着色器的编译,就算使用了不同的硬件,用一个着色器的编译结构也是一样的。
CG
CG是真正意义上的跨平台。
它会根据平台的不同,编译成相应的中间语言。
什么是Draw Call
Draw Call 就是CPU调用图像编程接口
CPU、GPU实现并行工作
使用命令缓冲区
命令缓冲区
由CPU向其中添加命令,而由GPU从中读取命令,添加和读取的过程是相互独立的。
当CPU需要渲染一些对象时,它可以向命令缓冲区中添加命令,而当GPU完成了上一次的渲染任务后,它就可以从命令队列中再取出一个命令并执行它。
Draw Call多了会影响帧率
在每次调用Draw Call 之前,CPU需要向GPU发送狠多内容,包括数据、状态和命令等。
在这一阶段,CUP需要完成很多工作,例如检测渲染状态等。
一旦CUP完成了准备工作,GPU就可以开始本次渲染。
因此渲染速度往往快于COU提交命令的速度。
如果Draw Call 的数量太多,CPU就会把大量时间花费在提交Draw Call上,造成CPU的过载。
减少Draw Call
批处理
注意点
-
避免使用大量很小的网格。当不可避免地需要使用很小的网格结构时,考虑是否可以合并他们
-
避免使用过多的材质。尽量在不同的网格之间公用同一个材质。