图像
图像文件如JPG、PNG格式文件中存储的各个像素对应的RBGA值,我们可以通过Python、Matlab对图像文件读入并处理像素获得需要的处理数据。
图形编程接口
你也许尝试使用过Qt GUI、C#窗口程序,通过各种接口可以很方便地在窗口程序中创建一个按钮、文本框,如果你了解窗口程序的运行,你会知道每个窗口程序有专门的UI线程(UI Thread)用来负责绘制(paint)、刷新(reflesh)窗口程序展现的内容,上文提到的按钮、文本框这些控件(widget)就是通过UI Thread绘制到窗口程序中并最终呈现在显示屏上。
以上的绘制过程并没有显卡的参与,准确说,是通过CPU与内存进行运算、存储的。
注:当然,Qt中的Qt Quick框架中运用了硬件加速(显卡参与计算),所以能制作出很酷炫的粒子效果等
学C#窗口程序的人可能脑子里会有很多想法,比如能否直接在C#窗口程序中制作一个动作游戏?
答案是完全可以。
你只需要画出素材,编写按键事件即可。当然这仅限于制作一些小游戏。我估计做出的效果应该和小时候玩的Flash游戏差不多。
如果你想做对场景要求很大的游戏或多媒体程序比如一个3D建模,那C#窗口程序就吃不消了,原因是C#窗口程序的绘制是使用CPU进行计算的,CPU的运算单元很有限而且低效(CPU是串行设计),而一个3D模型有几千上万个顶点(vertex),每一帧的刷新都是几十万次重复计算对于CPU珍贵且低效的运算单元来说力不从心。
这个时候,显卡就应运而生。显卡的特点如下:
高并行设计
核多,几百上千个核
GPU核多,是以牺牲流程控制能力为代价的,只能用来计算类似矩阵加减乘除这样规则的计算,可以非常快,完全并行实现,这时比CPU做同样工作要快的多,10-100倍左右的提升。
CPU与GPU的架构图如下:
可以看出运算单元(ALU)的数量差别。
OpenGL和DirectX、Metal、Vulkan都是图形编程接口,可直接操作GPU(如OpenGL中书写的Shader程序就是跑在显卡的计算单元中的)。
注:OpenGL严格意义上不算是接口,而是一种图形编程规范,定义了实现操作的接口名称以及作用,目前流行的实现有GLFW等
为了更直观地说明GPU的ALU都在做什么运算,笔者直接展示一段顶点着色器的GLSL(OpenGL Shader Language)代码:
#version 330 core
layout (location = 0) in vec3 aPos;
uniform mat4 model;
uniform mat4 view;
uniform mat4 projection;
void main()
{
gl_Position = projection * view * model * vec4(aPos, 1.0);
}
语法来说很像C语言,当然,ALU是看不懂这些高级语言的,OpenGL程序需要去编译(Compile)、链接(Link)才能使染色器程序正常运行。