3、2D时代
几十年工艺改进,解决了基本制造问题,计算机开始向应用过渡。显示问题是首当其冲的问题,多年的思辨与实践,2D技术横空出世,完善发展,为计算机的应用推广做出了卓越的贡献。双色显示的星星之火,在2D时代终于熊熊燃烧,计算机走向民间的时代到来了。
下面从公司产品的角度,回顾2D时代的图形图像编程。
3.1、公司
3.1.1、Amiga
Amiga是80年代图形性能最强大的电脑之一,拥有专门处理图形的芯片。杰.迈纳是当年显卡芯片设计的灵魂人物。下图Amiga500拆机,红圈内的denise芯片就是专门用来负责处理图形的,denise是真正意义上的2d加速卡。
这家公司在音视频多媒体领域超越当年的IBM与Apple,遗憾的是,最好的技术也被市场所淘汰。
3.1.2、IBM
1981年, IBM推出个人电脑,提供了两种显卡,一种是“单色显卡”(简称 MDA), 一种是 “彩色绘图卡” (简称 CGA)。
1982年,IBM又推出了MGA(Monochrome Graphic Adapter), 又称Hercules Card (大力士卡), 除了显示图形外,还保留了原来MDA的功能,IBM是世界第一块显卡制造商。
3.1.3、S3
S3在1989年开始造显卡,2D画质领域无人能及,盛极一时的Trident也无奈败下阵来。S3最经典的产品当属Trio64V+,有着高速的2D性能和强大的VCD软解实力,支持1024×768的分辨率,在低分辨率下支持最高32Bit真彩色。
那是一个VCD满天飞的年代,显卡的VCD解压能力是视频底层技术的一个突破。S3几经被转卖,先被威盛收编,后被HTC揽入囊中。今天,HTC步履蹒跚,生死一线。
3.1.4、Trident
Trident,这家公司当年在2D显卡领域红极一时,在当年的产品专柜里,多次看到其身影,后期由于技术方向原因,在3D显卡年代被淘汰。最终在2003年被XGI收购。而XGI最终在后来被ATI纳入麾下。
3.1.5、Matrox(迈创)
曾经独显领域的主要玩家,2D显卡时代声名显赫,3D时代落寞,最终转向小众视频市场。如今说起显卡GPU,很多人脑海里只会浮现NVIDIA、AMD两个名字,在上个世纪末,Matrox(迈创)的名字如雷贯耳。它的资格比NVIDIA、AMD要老得多。迈创来自加拿大(ATI也是),Matrox成立于1976年,比ATI早9年,比NVIDIA早17年。
3.2、图形技术
1976年~1995年是沉闷寂寥的2D时代,显示技术发展缓慢,,图形图像编程近乎停滞。市场期待着集成电路的发展、微电子技术的爆发。
1995年之后,硬件技术的春天到来了,3D显卡涌现,性能和技术有很大提升,鸟语花香,百家争鸣。厂商不断推陈出新才能生存,跟不上节奏的企业,逃不了被收购的命运。缅怀过去,继往开来,2D技术多年的发展为3D技术做了20年的铺垫。
结合过去历史,回顾当年2D编程的技术。
3.2.1、GDI编程
当时图形图像编程多使用GDI技术。
代码示例:
CDC *pDC = GetDC();
pDC->SelectObject(&…);
ReleaseDC(pDC);
GDI编程的出现,代表了消费级图像编程的兴起。
3.2.2、GDI+编程
GDI+是GDI的增强版,想当年,Windows平台的上的图形图像技术,走在各个平台的前端。
GDI编程为OpenGL和DirectX做了铺垫。
代码示例:
HINSTANCE hInst = AfxGetResourceHandle();
HRSRC hRsrc = ::FindResource (hInst,MAKEINTRESOURCE(nID),sTR); // type
if (!hRsrc)
return FALSE;
// load resource into memory
DWORD len = SizeofResource(hInst, hRsrc);
BYTE* lpRsrc = (BYTE*)LoadResource(hInst, hRsrc);
if (!lpRsrc)
return FALSE;
// Allocate global memory on which to create stream
HGLOBAL m_hMem = GlobalAlloc(GMEM_FIXED, len);
BYTE* pmem = (BYTE*)GlobalLock(m_hMem);
memcpy(pmem,lpRsrc,len);
IStream* pstm;
CreateStreamOnHGlobal(m_hMem,FALSE,&pstm);
// load from stream
pImg=Gdiplus::Image::FromStream(pstm);
// free/release stuff
GlobalUnlock(m_hMem);
pstm->Release();
FreeResource(lpRsrc);
无论GDI还是GDI+技术,都代表着图形图像编程的年代到来了。
3.2.3、Direct 2D
Direct2D的出现代表着引擎技术的到来,体现了市场对图形图像、音视频技术的强烈需求,在引擎的背后,封装了图形图像技术的专业性与复杂性。
代码示例:
#include <windows.h>
#include <d2d1.h>
#include <d2d1helper.h>
#include <dwrite.h>
#pragma comment(lib,"dwrite.lib")
#pragma comment(libd"d2d1.lib")
static HINSTANCE g_hinst;
static HWND g_hwnd;
static bool g_flag_app_exit;
static ID2D1Factory * g_factory;
static ID2D1HwndRenderTarget * g_render_target;
g_render_target->Resize(D2D1::SizeU(LOWORD(lparam),HIWORD(lparam)));
D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, &g_factory);
RECT rc;
GetClientRect(g_hwnd, &rc);
g_factory->CreateHwndRenderTarget(
D2D1::RenderTargetProperties(),
D2D1::HwndRenderTargetProperties(g_hwnd,
D2D1::SizeU(rc。right - rc。left, rc。bottom - rc。top) ),
&g_render_target);
g_render_target->BeginDraw();
g_render_target->Clear(D2D1::ColorF(0。63, 0。84, 0。00));
g_render_target->EndDraw();
g_render_target->Release();
g_factory->Release();
3.2.4、AGG
AGG,全名:Anti-Grain Geometry,一个开源的、高效2D图形库。AGG的功能与GDI+的功能类似,提供了比GDI+更灵活的编程接口,产生的图形的质量非常高,跨平台的2D图形引擎,可在Windows、Wince、Linux等平台上运行。
设计上,师出Boost库,使用了大量的C++语法规则,包括模板、仿函数等处理。为了能在更多平台上使用,并没有直接使用Boost和STL库,自己实现了部分STL功能。”
3.2.5、Cairo
cairo 是一个免费的矢量绘图软件库,可以绘制多种输出格式。cairo支持许多平台,包括 Linux、BSD、Windows等。Linux 绘图可以通过 X Window 系统、Quartz、图像缓冲格式或 OpenGL 上下文来实现。
cairo 的主要设计目标是提供尽可能接近的输出。这种一致的输出使 cairo 非常适合 GUI 工具集编程和跨平台应用程序开发。使用同一个绘图库打印高分辨率的屏幕和绘制屏幕内容,这种功能具有显著的优点。
在支持的目标平台上,cairo 尝试智能化地使用底层硬件和软件支持。高质量矢量图形和高性能的结合使cairo成为优秀的绘图系统。
cairo 用C编写的,为大多数常用的语言提供了绑定。选用C语言有助于创建新的绑定,在进行C语言调用时提供高性能。和Python绑定,支持快速原型开发,降低了学习 cairo绘图API的门槛。
代码示例:
#include <cairo.h>
int main (int argc, char *argv[])
{
cairo_surface_t *surface;
cairo_t *cr;
int width = 640;
int height = 480;
surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, width, height);
cr = cairo_create (surface);
/* Drawing code goes here */
cairo_set_line_width (cr, 10);
cairo_set_source_rgb (cr, 0, 0, 0);
cairo_rectangle (cr, width/4, height/4, width/2, height/2);
cairo_stroke (cr);
/* Write output and clean up */
cairo_surface_write_to_png (surface, "rectangle。png");
cairo_destroy (cr);
cairo_surface_destroy (surface);
return 0;
}
3.2.6、Cocoa Drawing
Cocoa Drawing是苹果公司的2D图形图像开发类库,在XCode下运用,旨在推广苹果公司的技术。纵然苹果一直有着很强的图形图像处理能力,但仅局限于苹果公司本身的软件,苹果在早期一直没有很好的图形图像编程引擎。
近些年苹果的Metal技术,才可以算作苹果公司真正的技术创举。
代码示例:
[NSGraphicsContext saveGraphicsState];
// Create the path and add the shapes
NSBezierPath* clipPath = [NSBezierPath bezierPath];
[clipPath appendBezierPathWithRect:NSMakeRect(0.0,0.0,100.0,100.0)];
[clipPath appendBezierPathWithOvalInRect:NSMakeRect(50.0,50.0,100.0,100.0)];
// Add the path to the clip shape。
[clipPath addClip];
// Draw the image。
[NSGraphicsContext restoreGraphicsState];
3.3、总结
计算机功能的强大,代表本身的强大,本身的强大代表体系的复杂,模块的组合,视频技术也不例外,从宏观角度来看,图形图像编程框架如下图。
软硬件技术是紧密结合的,硬件技术的进步推动了软件编程的繁荣,软件技术的应用促进了硬件的推广。早期的硬件公司驱动设计、专业级的编程接口研发,到后期消费级市场软件技术的繁荣。图形图像编程形成独立的软件阵地,呼唤着3D时代的到来。