shader 入门精要笔记(3)

Draw Call:CPU调用图像编程接口,如OpenGl中的glDrawElements命令或DX中的DrawIndexedPrimitive命令,以命令GPU进行渲染的操作。

CPU和GPU是如何实现并行工作的?

解决方法:使用一个命令缓冲区来避免CPU等到GPU完成上一个渲染任务才能再次发送命令造成的效率低下。命令缓冲区包含一个命令队列,由CPU向其添加命令,而GPU从中读取命令,添加和读取的命令是互相独立的从而实现CPU和GPU独立工作,这便是命令缓冲区的作用。命令缓冲区中的命令除了Draw Call一种外,还有改变渲染状态等(改变使用的着色器,使用不同的纹理)

为何Draw Call多了会影响效率?

每次调用Draw Call前,CPU需要向GPU发送很多内容,包括数据,状态,命令。这一阶段中,CPU需要完成许多工作,检查渲染状态等,一旦CPU完成了这些准备工作,GPU便可开始本次渲染。GPU渲染能力极强,渲染速度往往快于CPU提交命令的速度,如果Draw Call太多,CPU会把大量时间花在提交Draw Call上,造成CPU的过载。

如何减少Draw Call?

批处理是较为好的解决办法。如果提交大量很小的Draw Call会造成CPU性能的瓶颈,如果将其合并成一个大的Draw Call便很好的解决这个问题。由于我们需要在CPU的内存中合并网格,合并的过程也是需要消耗时间的。因此,批处理技术指在适合合并那些静态的物体,例如(大地,石头,静态的物品等)对于静态物体只需合并一次即可。对动态物体进行批处理时由于这些物体不断运动,每一帧都需重新合并然后发给GPU,因此对空间和时间都会有影响。

在游戏开发过程中,减少Draw Call需注意两点:1.避免使用大量很小的网格。当不可避免的需要使用很小的网格结构时,考虑是否可以合并他们。2.避免使用过多的材质。尽量在不同的网格之间共同使用一个材质。

具体来说shader就是:1.GPU流水线上的一些可高度编程的阶段,而由着色器编译出来的最终代码是会在GPU运行的。2.特定类型的着色器(顶点着色器,片元着色器)3.依靠着色器我们可以控制流速线中渲染的细节(利用顶点着色器进行顶点的变换或者传递数据,用片元着色器进行逐像素的渲染)一个好的游戏画面需适当的渲染状态,合适的混合函数,是否关闭(深度测试/深度写入)等,当然美术资源的质量越高,资源越规范对这一阶段的帮助也是极大的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值