4、3D时代
历史长河中,科技进步是人类文明的主要推动力。沧海桑田,天下多变,人类对科技的研究与探索从未停止,计算显示技术也不例外。
现实是3D的,显示硬件注定也是3D的。透过历史的云烟,得到岁月的启示,硬件对3D技术的支持是显卡厂商存活的根本。硬件对图形图像引擎的支持,是显示芯片公司做大做强的基础。引擎支持主要包括OpenGL和D3D引擎支持,在2000年前尤为明显。
科技的风风雨雨,面临着技术的抉择和选型,无论辉煌黯淡,时光默然前行,那些远行的技术,做了科学的辩证。
4.1、公司
4.1.1、3Dfx
1994年,3Dfx成立,在当时是一家小公司,定位明确,很快就推出了业界的第一块真正意义的3D图形加速卡:Voodoo。在当年,Voodoo在速度以及色彩方面的表现让喜欢游戏的用户为之疯狂,Voodoo几乎是玩家们唯一的选择,当年3Dfx的专用Glide引擎接口统治了整个3D世界。当年一个专业图形引擎,可拯救一系列产品,成就一家硬件厂商。
Glide引擎提供了专业的3D图形显示接口,Glide可以说是一套3D接口库,3Dfx凭借硬件与引擎的结合创造了发展历史上的奇迹。3Dfx的成功就是在3D硬件支持和相关引擎支持良好的表现。
3Dfx从硬件上实现了Z缓存和双缓存,可进行光栅化之类的操作,实现了DirectX 6的特征集。CPU从繁重的像素填充任务中解脱出来。当然,当年的技术不成熟,顶点变换必须在CPU中完成,光栅化之后的像素操作也很有限。
4.1.2、ATI
说起显卡,我们不能不提ATI,由于对3D技术支持较好以及紧跟OpenGL和DirectX步伐。多年和英伟达齐名。后来由于显卡驱动问题,造就了A卡追击N卡的局面。ATI提供了良好的编程接口,成为推广的一个重要因素。
ATI的欻创始人何国源先生,广东新会人,在很多年间都是芯片界的顶级人物。AMD在2006年以54亿美元收购ATI,何国源从此退出显卡芯片行业。今天世界上很多电脑的显卡都有ATI的技术。下面是显卡领域的两个风云人物,何先生已金盆洗手,退出江湖,黄药师依然皮衣挂帅,征战一线。
市场风云变幻,毫无疑问,ATI是幸运的,当年潜图问鼎,雄霸天下。直至后来被高价收购,多年后的今天,A卡依然笑傲江湖。
4.1.3、NVIDIA
提起显卡,必须提及另外一个厂家NViDia,英伟达的创始人黄仁勋先生,台湾台北人,江湖人称黄药师(老黄)。近20年以来,世界顶级芯片巨头。在图形处理芯片上,何国源和黄仁勋都做出了不可磨灭的贡献,图形处理芯片的前身,就是今天的GPU,GPU是英伟达推出的。
NVIDIA 通过NV系列产品小试牛刀,通过GeForce 系列产品出征江湖,屡战屡胜,战功显赫,今天稳坐显示领域第一把交椅,无人出其左右。在人工智能数据分析方面,英伟达依然战功显赫。
想当年,显示领域是英伟达和ATI的天下,两者相互竞争,推动了显示技术的发展。成就了今天的显示规范。当年的竞争本质是显示指令、Shader编程、效率的竞争。
英伟达的NV3开始支持OpenGL,取得了巨大的成功。后期开始支持Direct3D。也就是前期对这些框架支持不足,导致经营举步维艰。
1999年8月,NVIDIA公司发布了一款代号为NV10的图形芯片Geforce 256。Geforce 256是图形芯片领域开天辟地的产品,因为它是第一款提出GPU概念的产品。
Geforce 256所采用的核心技术有“T&L”硬件、立方环境材质贴图和顶点混合、纹理压缩和凹凸映射贴图、双重纹理四像素、256位渲染引擎等。“T&L”硬件的出现,让显示芯片具备了以前只有高端工作站才有的顶点变换能力,同时期的OpenGL和DirectX 7都提供了硬件顶点变换的编程接口。1999年,GPU的概念就这样出现了。
GPU的推出,不仅仅是硬件体系的革命性变化,更是对显示标准的强大支持。今天3D引擎编程,核心主要也是面向GPU的编程。
后期ATI被AMD收购,纵然没有英伟达耀眼,但整体发展还算顺利,形成了A卡和N卡竞争的格局。
2020年,英伟达收购ARM,市值超过3300亿美元,超过INTEL 1000亿美元,成为全球市值排名TOP10。在西方的土地上,一个黄种人,一个台湾人,战功显赫。
4.1.4、3DLabs
3D技术飞速发展,专业显卡需求增大。专业公司应运而生。3DLabs就是这样的公司,开发高端绘图芯片,对OpenGL的完美支持,性能强大,当时的OpenGL普通显卡难以完全支持。
当年在专业显卡市场,3DLabs的产品几乎是唯一选择。面对瞬息万变的世界,3DLabs还是落后了,对D3D技术重视不足和对OpenGL过度依赖,最终被黄药师的Quadro干掉。于2002年被创新科技收购,成为旗下子公司。
对D3D的支持程度不仅仅影响民间显卡,对专业显卡也有很大的影响。显卡的发展不仅仅要考虑OpenGL,更要考虑D3D。D3D是微软的,操作系统是微软的,Windows垄断操作系统的存在,对D3D是一个强大的支持。公司决定软件,软件决定硬件又一次得到体现。
4.1.5、Video Logic
Video Logic前期主打产品是PowerVR,当年PowerVR也涉足桌面显卡市场,比较有名的就是PCX2芯片,性能强大,支持D3D、OpenGL,然而驱动程序兼容性较差,游戏运行有问题,对CPU要求较高,影响了销售。即使如此,在很长时间内,市场占有率一直保持第二。
对图形图像引擎的支持、驱动的友好程度决定了硬件的发展。后期由于优化不好,兼容性问题、软件冲突等,容易引起渲染错误或性能下降。离不开最终被转卖的命运。
相比太多厂商,PowerVR是幸运的,桌面市场失败了,但PowerVR睿智的转向了移动图形市场,避免了桌面市场的残酷竞争,发挥了自己的技术优势,移动端成为未来的趋势,PowerVR成为移动显示领域的重要力量。
PC端计算机图形学发展的同时,移动端技术的兴起,移动端细分专业显示芯片的出现,进而发展成为独立的领域,计算机图形学向精细化发展。
4.1.6、intel
英特尔是美国一家以研制CPU为主的公司,是全球最大的个人计算机零件和CPU制造商,成立于1968年,具有52年产品创新和市场领导的历史。
1971年,英特尔推出了全球第一个微处理器。微处理器所带来的计算机和互联网革命,改变了整个世界。
2016年4月,英特尔推出处理器至强7290F采用了多达72个处理器核心,成为英特尔核心数最多的处理器。2019年2月,英特尔推出至强铂金9282,它有112个线程,是线程最多的处理器。
2020年7月,福布斯2020全球品牌价值100强发布,英特尔排名第12位。9月3日,英特尔推出了新的极简主义 Logo。
谈到显卡,不能回避intel,由于特殊的地位,相比其它厂商,在显卡的道路上,走的相对平稳与踏实。i740就是Intel推出的第一款产品,极大的推动了AGP标准的发展。
intel专注于集成显卡领域,从i740之后,再也没有推出过独立显卡,i740成了Intel独立显卡的绝唱。纵然在显卡领域没有大的建树,但intel一直在坚守。
4.1.7、AMD
AMD显卡即ATI(被AMD收购)显卡,俗称A卡。搭载AMD公司的显示芯片。与NVIDIA齐名,同为世界两大显示芯片厂商之一。由于收购关系,在本专题中,不做过多讲述。
AMD是目前业内唯一一个可以提供高性能CPU、高性能独立显卡、主板芯片组三大组件的半导体公司,为明确其优势,提出3A平台新标志,在笔记本领域有“AMD VISION”标志的就表示该电脑采用3A构建方案。
今天显卡市场,是A卡与N卡的天下,19年第四季度,AMD出货量环比大增22.6%,份额19%,NVIDIA减少1.9%,份额18%,Intel微增0.2%,份额63%。由于计算将Intel核显、APU算在内,NVIDIA并无优势。
在独显方面,AMD出货量占比27%,较上季度的24%和去年的26%均有增加,但NVIDIA仍旧以73%垄断剩余市场。今年,Intel Xe架构独显将面世,对独显格局有一定冲击。
AMD显卡与NVIDIA显卡相比,有更高的功耗与更高的性能。AMD显卡的子品牌有 ATI 和 Radeon,显卡型号众多。今天,AMD(ATI)显卡技术坚挺,依然耀眼。
4.2、软件与硬件
4.2.1、接口与硬件
专业图形图像领域,Z缓存和双缓存称为了3D图形技术的标配。在今天的流行图形图像API里,当年的Z缓冲和双缓冲,仅仅是今天图形图像引擎的一个参数或者一个函数而已,参数和函数的背后,是硬件的支持。
显卡插口有PCI和AGP两种。在数据处理上,逐渐支持高速和并行。具有着更大的传输速率,更复杂数据的处理能力。硬件技术的变革推动了软件技术的进步。
任何技术的发展都不是一帆风顺的,显示技术也不例外。每一次技术的革新,都可能带来革命性的变化。那些曾经被淘汰、被边缘化的技术,为主流技术的发展做了助攻。在显卡技术发展过程中,硬件的升级,架构的改变,都代表着功能的提升。
下图从另外一个角度,展现显卡发展的过程。
4.2.2、3D引擎
遥想当年,视频编程主要靠专业引擎来体现,各家公司雄心勃勃,开宗立派,在数家公司的专业图形图像接口里,OpenGL和DirectX最终胜出。今天,消费级市场主要通过OpenGL和DirectX来体现。
可悲的是,早期在linux上很少有图形图像编程的处理。一直到今天,图形图像工作主要还是在Windows和Mac上进行。
时光的河流,流淌着一个真理,对3D的支持,以及对3D相关图形系统的支持,是硬件厂商存活的根本。这里的3D支持,就是3D引擎。
当年的图形图像编程,OpenGL刚刚起步,很多公司提供的应用引擎都是对OpenGL和D3D的封装。
4.2.2.1.OpenGL
OpenGL是渲染2D、3D数字图形的跨语言、跨平台的应用程序编程接口(API)。由近350个函数组成,绘制简单图形和复杂三维景象。OpenGL常用于CAD、虚拟现实、科学可视化和游戏开发等。OpenGL直接操纵图形硬件,高效进行图形图像编程,实现一般由显示设备厂商提供。OpenGL是对显卡编程的工业接口。
OpenGL规范由1992年成立的OpenGL架构评审委员会(ARB)维护。ARB由业界顶级软硬件公司组成,下图是OpenGL的发展过程。
OpenGL API定义了若干被客户端程序调用的函数,以及一些整型常量。这些实现方便了开发者调用。
OpenGL与语言平台无关。规范没有获得和管理OpenGL上下文相关的内容,将这些细节交给底层窗口系统。OpenGL专注图像渲染,不提供输入、音频及窗口相关的API。
OpenGL不断进化API。新版规范定期由Khronos Group发布,新版本通过扩展API来支持各种新功能。每个版本细节由Khronos Group成员一致决定,包括显卡厂商、操作系统设计人员以及类似Mozilla和谷歌的技术性公司。
除了核心API功能,GPU供应商通过扩展的形式提供额外功能。扩展引入新功能和新常量,增加或取消现有OpenGL功能。
每个扩展与一个标识符联系,标识符基于开发公司的名称。例如,英伟达(nVidia)的标识符是NV。如果多个供应商同意使用相同的API来实现相同功能,那么就用EXT标志符。这种情况更进一步,Khronos Group的架构评审委员(Architecture Review Board,ARB)正式批准该扩展,那么就被称为一个“标准扩展”,标识符使用ARB。第一个ARB扩展是GL_ARB_multitexture。
OpenGL每个新版本中引入的功能,特别是ARB和EXT类型的扩展,通常由数个被广泛实现的扩展功能组合而成。
代码示例:
#include <GLTools。h> // OpenGL toolkit
#include <GLShaderManager。h> // Shader Manager Class
GLBatch triangleBatch;
GLShaderManager shaderManager;
void ChangeSize(int w, int h);
void SetupRC();
void RenderScene(void);
gltSetWorkingDirectory(argv[0]);
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH | GLUT_STENCIL);
glutInitWindowSize(800, 600);
glutCreateWindow("Triangle");
glutReshapeFunc(ChangeSize);
glutDisplayFunc(RenderScene);
SetupRC();
glutMainLoop();
4.2.2.2、DirectX
微软在业界的大哥地位,影响力不言而喻。在发展史上,多次和IBM对博公堂,微软宣布,凡是IBM的电脑,不能安装Windows操作系统。软件厂商要挟硬件厂商,在微软发展历史上,留下了光辉的一页。
音视频是电脑最核心的功能之一,作为系统供应商,微软推出了自己的DirectX产品,该产品在1995年前后十几年间,决定了很多硬件厂商的生死。
示例代码:
#pragma comment(lib,"d3d9.lib")
#pragma comment(lib,"d3dx9.lib")
#include <d3dx9。h>
LPDIRECT3D9 g_pD3D = NULL;
LPDIRECT3DDEVICE9 g_pD3DDevice = NULL;
LPDIRECT3DVERTEXBUFFER9 g_pVertexBuffer = NULL;
HRESULT InitialiseD3D(HWND hWnd)
HRESULT InitialiseVertexBuffer()
void SetupRotation()
void SetupCamera()
void SetupPerspective()
void Render()
void CleanUp()
当我们平心静气面对这些技术和代码时,深刻的感受到,尤其在早期,当年的D3D技术对显卡厂家的影响是可怕的,对D3D技术的支持程度代表了显卡的受欢迎程度。当年的D3D技术应用最主要是游戏领域。
从D3D的发展,得到岁月的启示,垄断阻碍了技术的发展,相信在某一天,D3D也终究会退出技术的舞台。
4.2.3、Shader编程
Shader在3D编程里面占据着重要的地位,是OpenGL、DirectX、Unity等引擎中最核心的概念。成了3D图形图像编程的核心标配。
示例代码:
#version 130
in vec4 vVertex;
in vec3 vNormal;
uniform vec4 ambientColor;
uniform vec4 diffuseColor;
uniform vec4 specularColor;
uniform vec3 vLightPosition;
uniform mat4 mvpMatrix;
uniform mat4 mvMatrix;
uniform mat3 normalMatrix;
smooth out vec4 vVaryingColor;
void main(void)
{
vec3 vEyeNormal = normalMatrix * vNormal;
vec4 vPosition4 = mvMatrix * vVertex;
vec3 vPosition3 = vPosition4。xyz / vPosition4。w;
vec3 vLightDir = normalize(vLightPosition - vPosition3);
float diff = max(0。0, dot(vEyeNormal, vLightDir));
vVaryingColor = diff * diffuseColor;
vVaryingColor += ambientColor;
vec3 vReflection = normalize(reflect(-vLightDir, vEyeNormal));
float spec = max(0。0, dot(vEyeNormal, vReflection));
if(diff != 0)
{
float fSpec = pow(spec, 128。0);
vVaryingColor。rgb += vec3(fSpec, fSpec, fSpec);
}
gl_Position = mvpMatrix * vVertex;
}
4.2.2.3、Metal
Metal是苹果公司的图形编程库,近两年取得了巨大的发展。在Mac平台和IOS平台音视频开发上,Metal是一个很好的选择。
Metal提供对GPU的直接访问,技术人员最大程度地发挥 iOS、macOS和Apple tvOS app中的图形硬件计算潜能。Metal构建于易用的低开销架构之上,提供预编译的GPU 着色器和精细的资源控制。
Metal支持多线程,支持 GPU 驱动命令创建。支持GPU阵列编程,充分利用 Mac Pro 和 Pro Display XDR 的专业级多媒体功能。
渲染示例代码:
#import "Renderer.h"
typedef struct {
float red, green , blue, alpha;
}Color;
@implementation Renderer
{
id<MTLDevice> _device;
id<MTLCommandQueue> _commandQueue;
}
//画view的内容,这个代理方法会按帧率执行
-(void)drawInMTKView:(MTKView *)view{
//获取颜色
Color color = [self makeFancyColor];
//设置背景色
view.clearColor = MTLClearColorMake(color.red, color.green, color.blue, color.alpha);
//创建一个命令缓冲区
id<MTLCommandBuffer> commandBuffer = [_commandQueue commandBuffer];
commandBuffer.label = @"mycommand";
//渲染过程,用于保存渲染过程的结果
MTLRenderPassDescriptor *renderPassDescriptor = view.currentRenderPassDescriptor;
if (renderPassDescriptor != nil) {
id<MTLRenderCommandEncoder> renderEncoder = [commandBuffer renderCommandEncoderWithDescriptor:renderPassDescriptor];
renderEncoder.label = @"myrenderEncoder";
//结束编码
[renderEncoder endEncoding];
//注册一个可绘制图像
[commandBuffer presentDrawable:view.currentDrawable];
}
//提交命令到GPU
[commandBuffer commit];
}
//视口发生变化会被调用
- (void)mtkView:(nonnull MTKView *)view drawableSizeWillChange:(CGSize)size {
}
@end
4.2.2.3、Vulkan
Vulkan是一个跨平台的2D和3D绘图应用程序接口(API),科纳斯组织(Khronos Group)在2015年游戏开发者大会(GDC)上发布。
Khronos Group目前是世界多媒体、音视频、图形图像领域的核心协会,拥有世界顶级会员单元,拥有世界级的技术标准。
科纳斯把Vulkan API称为“下一代OpenGL行动”(next generation OpenGL initiative)或“glNext”。就像OpenGL,Vulkan针对实时3D程序(如电子游戏)设计,Vulkan并计划提供高性能和低CPU管理负担(overhead),这也是Direct3D12和AMD的Mantle的目标。Vulkan兼容Mantle的一个分支,并使用了Mantle的一些组件。
Vulkan 是 AMD Mantle 的后续版本,继承了强大的低开销架构,使软件开发能够全面获取 Radeo GPU 与多核 CPU 的性能、效率和功能。
Vulkan 支持深入硬件底层的控制,为各种系统带来更快的性能和更高的影像质量。Vulkan API 还提供超高的 OS 兼容性、渲染特性和硬件效率。
基于GCN架构的Radeon 显卡拥有强大的“异步计算”功能,使显卡并行处理3D几何图形与计算工作量。当游戏需要同时计算复杂照明与渲染人物时,这种功能就找到了用武之地。这些任务并不需要在Radeon显卡上串行运行,节约时间、提升整体帧速率。Vulkan在近期Windows和Linux系统上都有很好的应用。
目前,Vulkan得到广泛的的支持,在硬件上,无论是服务器、桌面、移动端,都进行了完好的支持。在系统层面上,Linux、Windows、Mac、Android、IOS都为Vulkan提供了完备的接口。
示例代码:
#include <vulkan/vulkan.h>
#include <stdexcept>
#include <functional>
class HelloTriangleApplication
{
public:
void run()
{
initVulkan();
mainLoop();
cleanup();
}
private:
void initVulkan() {}
void mainLoop() {}
void cleanup() {}
};
int main()
{
HelloTriangleApplication app;
try
{
app.run();
}
catch (const std::runtime_error& e)
{
std::cerr << e.what() << std::endl;
return EXIT_FAILURE;
}
return EXIT_SUCCESS;
}
4.3、启示
计算机图形学的发展不是一蹴而就的,前期发展过程中,百花齐放,百家争鸣。各家接口不一,处于蓬勃不稳定发展期,系统厂商、硬件厂商、软件厂商、行业协会一起,共同推出软硬件规范,OpenGL就是一个成功的表现。
技术发展过程中,一些厂商没有明确的规范或没有明确的支持规范,进而失败了。没有硬件厂商支持的规范同样是可悲的,很快被淘汰了。软件运行在硬件之上,硬件在一定程度上决定着软件。软件反过来影响着硬件。
3D时代绚丽多彩,现实生活姹紫嫣红,多年技术积淀,在3D时代五彩斑斓,应用辈出。显示技术的应用发挥到了极致,对计算技术的发展做出了卓越的贡献。
3D时代的到来,为显示技术的精细化发展吹响了号角。在计算机图形图像技术发展史上,承前启后,继往开来。