关于图像与图形编程接口之区别

时光怂恿深爱的人放手 提交于 2020-02-27 08:13:25

图像

图像文件如JPG、PNG格式文件中存储的各个像素对应的RBGA值,我们可以通过Python、Matlab对图像文件读入并处理像素获得需要的处理数据。

图形编程接口

你也许尝试使用过Qt GUIC#窗口程序,通过各种接口可以很方便地在窗口程序中创建一个按钮、文本框,如果你了解窗口程序的运行,你会知道每个窗口程序有专门的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)才能使染色器程序正常运行。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!