UnityShader入门精要学习 第二章解惑

困惑

什么是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

批处理


注意点

  • 避免使用大量很小的网格。当不可避免地需要使用很小的网格结构时,考虑是否可以合并他们

  • 避免使用过多的材质。尽量在不同的网格之间公用同一个材质。

  •  
posted @   Apollonia  阅读(35)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
点击右上角即可分享
微信分享提示