定义
显卡(Graphics Card):显卡由GPU、显存、总线以及其他的外围组件,比如HDMI接口、DVI接口等等组成。
GPU(Graphics Processor Unit,图像处理单元):GPU是由数千个计算核心构成的超级CPU,这些核心能够对不同的像素点并行运算,不过单个核心能做的事情比较单一,速度也远不及CPU的一个核心;很多在CPU运行较快的指令照搬到GPU上会慢很多,比如CPU常见的
if else
条件语句,这也是为什么在shader编程中尽量避免使用条件语句的原因。用途
- 机器学习
- 深度学习
- 比特币挖矿
- 视频快速编解码
显卡编程
对显卡的编程大致分为两种:
- 并行计算编程(parallel computing)
比如CUDA、OpenCL、OpenACC框架,使用它们可以对图形进行处理,或者高效、密集的数学运算,制作实时的电影特效,或者用于训练一个深度学习网络
- 图形编程(graphics programming)
也是显卡在设计之初的主要功能,利用显卡来生成实时的三维图像
实时渲染(Real-time Rendering)
显卡如何在屏幕中渲染出实时的三维图形
其实空间中的三维物体都是由很小很小的三角形构成的,三角形作为最基础的图元之一,可以构成很多复杂的图形,比如正方形可以分解成两个三角形,而所有的多边形都能分割成若干个三角形。三角形的优点还包括:它的三个顶点可以唯一在空间中确定一个平面。
当我们知道任何图形在计算机中都由许多三角形构成,显卡的工作就是对这些三角形并行进行一系列流水线的运算。首先,显卡会根据观察角度、视野大小对三角形进行坐标变换;坐标确定之后,显卡就会对三角形覆盖的区域进行逐像素点的绘制和上色,每个像素点的颜色其实是根据物体的材质、纹理以及场景中的光源计算而来。
显卡编程API
- OpenGL
- DirectX
- Vulkan
显卡驱动程序(Graphics Driver)
当我们向显卡下达指令的时候,
driver
会将指令翻译成显卡硬件能够直接运行的机器码。着色器(Shader)
屏幕上的形状、颜色都是由
shader
程序控制的,更宽泛地说,Shader
程序做的事情就是根据预先设定好的场景模型给屏幕上的每个像素点上色。Shader的编程语言有:
GLSL
、HLSL
、SPIR-V
,SPIR-V
是我们无法直接看懂的字节码,我们可以通过一些程序将GLSL
、HLSL
转换成SPIR-V
。