显示硬件发展与视频开发系列(2)----2D时代

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时代的到来。

猜你喜欢

转载自blog.csdn.net/qq_33277028/article/details/112372395
2D