【入门】了解shader编程语言 GLSL、HLSL和CG

三大shader语言

1.为什么要了解shader语言

我们想要让画面通过显卡渲染出来呈现在屏幕上,肯定少不了对于显卡的调用和控制。但如果我们每次操作都需要直接对显卡内部的核心、显存之类的进行沟通则太过于复杂了。所以为了解决这种问题,需要对显卡内部的底层指令进行一些封装,把他们转化为较为简洁的API接口,这样我们只需要对这些接口进行调用,就可以免去复杂的显卡底层操作。那么下文中三大语言便是用来对应OpenGL、DirectX和NVIDA分别提供的不同的图形渲染接口的语言。
所谓的 Draw Call 就是CPU对于这些图形渲染接口发出的一条条渲染指令,他们被渲染接口接收后会通过显卡驱动转为显卡可识别的底层代码。

2.三大shader编程语言

1)基于OpenGL的GLSL(OpenGL Shading Language)

OpenGL是Khronos Group开发维护的一个规范,它定义了用来操作图形和图片的一系列函数的API,需要注意的是OpenGL本身并非API,只是一套规范,真正的API一般实现在各厂商的显卡驱动。OpenGL部分本身不提供着色器编译器内容,这部分功能依靠显卡驱动更底层的部分来完成,这也意味着只要显卡驱动支持OpenGL则代表可以兼容该平台硬件。并且由于通过硬件实现,提供商可以通过自己对硬件的理解对应的进行更好的把控和优化,从而发挥各方面的最优效果。基于这种直接硬件编译的操作,GLSL得以支持Windows、linux、Mac、移动端等实现跨平台的优点。但这么作弊端也很明显:各个厂家的显卡驱动多少会不太一样,这可能会导致同样的GLSL代码在不同硬件环境下的实际表现效果产生差异。

2)基于DirectX的HLSL(High Level Shading Language)

由微软推出的高阶着色器语言。语法上类似于C和C++,最初是为了弥补Direct可读性差、效率低等一系列缺点而建立在Direct8.x之上的高级语言。不同于GLSL全部交给硬件的方式,HLSL的着色器编译的工作由微软自己来控制,这样避免了由于硬件差异导致的最终结果差异。但缺点则是只能有限支持微软自己的产品。其他产品可能需要有对应的HLSL编译器支持才行。

3)基于NVIDIA公司的CG(C for Graphic)

诞生于英伟达与微软的合作,所以在语法和使用上与HLSL高度一致。一般情况下这两种语言可以进行互相转换,并且本质上二者其实相当于同一种语言。但关键的点在于CG真正意义上进行了跨平台的操作,他会根据不同平台编译与之相对应的中间语言从而实现跨平台无差异化运行,弥补了HLSL的基础上也对OpenGL发起了挑战。

3.什么是Unity Shader

但Unity shader并不是上面说的传统意义上的Shader,他为传统的Shader再次进行了封装,叫做ShaderLab。从定义上来讲就是一个更高一级的渲染抽象层。开发者不必再忙碌于根据平台选择对应图像接口还有反复载入模型设置渲染状态设置顶点着色器片元着色器等等巴拉巴拉,只需要使用ShaderLab编写出Unity Shader,其他的交给渲染引擎就好。所以每一次代码的封装都是对一个实现层进行化繁为简的操作,经过了层层的封装实现,如今的Unity Shader才得以将整个CPU调用不同GPU进行渲染的庞大操作整合在一个ShaderLab当中。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值