計算機圖形學&OpenGL系列教程(二) 圖像、顯卡與顯示器

(本文由原作者轉自出處,轉載請保留信息)
  在上一章中提到,計算機圖形學主要研究內容就是研究如何在計算機中表示圖形、以及利用計算機進行圖形的計算、處理和顯示的相關原理與算法。網上大多數教程都缺失對圖像,以及渲染圖像的顯卡,顯示圖像的顯示器的介紹,然而這些內容又是必要的,只有瞭解一定的這些內容的原理,才能正確使用OpenGL進行計算機圖形學的學習。此外,本章的內容也對於學習數字圖像處理,計算機視覺,或者理解現在顯卡用於人工神經網絡的訓練的原理有一定的幫助。

圖像

計算機中表示圖像數據的方法

  首先,由於計算機顯示器是發光的光源,因此顯示的任何顏色都是通過紅色(R),綠色(G),藍色(B)所謂的光學三原色合成所得。圖形學中也常常使用三原色的信息去表示圖像,一個顏色可以用向量(R, G, B)表示。每個分量的範圍,如果用整數表示的話常見範圍是[0, 255](只取整數),如果用實數表示,則常見範圍爲[0, 1](包含0到1之間所有實數)。OpenGL中常用float類型(單精度(32位)浮點數類型)表示顏色的分量,顏色的分量的取值就是在[0, 1]之間的實數。一個分量的值越大,則其對應的顏色越“濃”。如果使用整數表示顏色的分量,那麼純紅色就是(255, 0, 0),純綠色是(0, 255, 0),純藍色是(0, 0, 255),純紫色是純紅色與純藍色的混合,是(255, 0, 255)。此外,還可以給顏色加入第四個分量,不透明度A(Alpha),通常用在多張圖像的混合中,直觀地看,不透明度越大,則在與其它圖像疊加合成時,越無法看到在這張圖片的下面的圖像。(有使用過Photoshop的同學都懂的~)
在這裏插入圖片描述

  計算機中圖像都是一個矩形,具有寬度和高度,寬度表示圖像在水平方向上的像素數量,高度表示圖像在豎直方向上的像素數量。通常我們依照像素在圖像內的位置,類似笛卡爾座標系那樣,取圖像左上角爲原點(0,0),水平向右方向爲x軸正方向,豎直向下方向爲y軸正方向,這樣給圖像的每一個像素編碼一個位置座標(x, y)。以後我們就使用這個位置座標(x,y)代指位於(x,y)位置的像素點。
在這裏插入圖片描述
  每一個像素點上通常儲存這一個像素的顏色信息,顏色信息數據的大小(比特數)稱作位深度,例如圖像每一個像素使用3個unsigned char儲存顏色信息,那麼圖像的位深度爲3x8=24(每個unsigned char有8個比特,3個有24比特)。 最終圖像的有像素構成了圖像。

  這裏列出實際編程中常見的兩種顏色信息的編碼方法:

索引圖像

  在索引圖像內部,包含一個額外的顏色映射表(color map,簡稱顏色表),顏色表內包含了圖像中所有用到的顏色color[0], color[1], color[2], …, 顏色表內所有顏色都由是一個顏色向量(R, G, B)。

  有了顏色表,圖像的每一個像素點只儲存它表示的顏色在顏色表中的位置(下標)即可。

例如有一張寬度爲4,高度爲3的索引圖像,顏色表爲:

color[0] = (255, 0, 0)
color[1] = (0, 0, 255)

圖像的所有像素爲:

1111
0000
1111

查顏色表可得,1表示(0,0,255), 0表示(255,0,0),那麼這就看作是一張背景爲藍色,中間一條紅線的圖像。

另一種現在更常用於表示真彩色圖片的圖像編碼方法,則是直接在每一個像素上儲存顏色本身,也就是每一個像素直接儲存一個(R,G,B)(或者是(R,G,B,A)),表示圖像。例如索引圖像中的例子,用RGB圖像表示就是:

(0,0,255)(0,0,255)(0,0,255)(0,0,255)
(255,0,0)(255,0,0)(255,0,0)(255,0,0)
(0,0,255)(0,0,255)(0,0,255)(0,0,255)

圖像數據的儲存

  在依上一節的方法,將圖像編碼成圖像數據後,在OpenGL中往往是直接可以使用的。然而我們平常所見的圖片文件的情況要更復雜一些。常見的典型的圖片文件,有BMP,PNG, JPEG(JPG)三種文件格式,相對應三種圖片文件編碼方式,BMP是一種無壓縮的圖片文件格式,將圖片信息放在文件頭部,後面直接存放原始的顏色表(如果有)和像素數據。PNG是一種無損壓縮的圖片格式,直接儲存圖片的像素數據通常比較佔用空間,PNG對數據進行了無損壓縮。而JPEG是一種有損壓縮的圖片格式,通常能夠得到比PNG格式更小的圖片文件,但也會輕微損失圖片質量。更加詳細的信息參閱百度百科,在我們學習OpenGL的過程中只需要學會使用第三方庫讀取圖片文件得到圖像數據,或者是把圖像數據寫入圖片即可。

顯卡

  顯卡(Video Card)在計算機中承擔着向顯示器輸出視頻信號的功能,早期的顯卡只是一個能夠將主機指定的要顯示的數據,轉化爲顯示器可以識別並顯示出來的設備,還並沒有具有獨立處理圖形的能力;隨着技術的發展與需求的迭代,現代的顯卡還具有圖形處理,並行計算的能力,也能夠實現AR,VR等技術, 目前PC端的獨立顯卡的主要顯卡供應廠商爲NVIDIA(英偉達)和AMD(超威半導體公司),只要採用NVIDIA顯示芯片的顯卡被稱爲N卡,採用AMD顯示芯片的顯卡被稱爲A卡。本教程無意爭論N卡好還是A卡好,要避免意識形態之爭,實事求是,與時俱進,凡是有利於學習OpenGL理解計算機圖形學的顯卡都是好顯卡。此外,筆記本電腦往往爲了節約功耗,會配備帶有集成顯卡的處理。

  本教程中提到的顯卡指代的都是上文中提到的現代化的顯卡,也是同學們電腦上所使用的顯卡(如果真的沒有,那買新電腦吧)。顯卡內含顯示芯片,或稱圖形處理器(Graphics Process Unit, GPU),具有並行計算能力,並配有專用的顯示儲存器(簡稱“顯存”),GPU與顯存的關係,就如同CPU與主存(俗稱“內存”)的關係。

  GPU的並行計算能力,極大加速了圖形處理的速度。我們以NVIDIA20系顯卡爲例,感性地說明其並行計算能力:
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
  從上面三張圖提供的數據可以直觀的看到,GPU具有大量的計算單元(圖中的10系和20系旗艦級顯卡都有上千個,往往遠遠超過其搭配的cpu的核心數),在實際使用時可以進行大規模地並行計算。而圖形處理正是適合使用並行計算的場景,在之後的學習中我們會發現,我們會對所有輸入的圖元,以及圖元柵格化後所得圖像的所有像素,運行同樣的一段代碼(之後會講到,在渲染流水線中,我們對輸入的所有頂點運行同一個頂點着色器程序,對圖像所有像素運行同一個片段着色器程序),而且互不干擾。如果使用CPU去完成,由於CPU核心數量少,一次能夠同時處理的圖元或者像素數量少。而GPU有着大量的可並行計算的核心,能夠同時爲大量的圖元或者像素運行程序,這也是GPU在圖形處理速度上總遠遠優於CPU的主要原因。此外,GPU這種大規模並行計算的能力,也被髮掘並應用到其它領域,例如機器學習,區塊鏈等。但是GPU也有其自身的侷限性,它的單核性能往往遠比CPU單核要差,而且由於GPU的特殊構架設計,它只適合進行簡單的數學計算,而不適合應對更加複雜的業務場景(比如說GPU上代碼使用if條件分支語句會極大損耗性能)。我們可以這樣形象地比喻CPU和GPU,CPU是一名博士生,而GPU是一大羣小學生,對於大量的簡單題目,一大羣小學生完成的速度自然比一名博士生要快。然而對於困難的問題,博士生依然可以完成,而一大羣小學生也無法完成。

  CPU與與之搭配的主存,GPU有與之搭配的顯存,主存和顯存中都是可以儲存數據的,他們之間也是可以進行數據的交換的。然而主存和顯存之間數據傳輸的速度是遠比CPU與主存或是GPU與顯存之間的速度要慢的(一般來說要慢一個數量級),因此在實際編程中我們應當儘量避免不必要的主存和顯存之間的數據交換。

  拓展:早期依照IBM計算機的名爲"VGA"的顯示標準,在文本模式下內存絕對地址0xb8000處,或圖形模式下內存絕對地址0xa0000處,存放要在顯示器上顯示的數據,顯卡只會定期(時間間隔相當短)將這裏的數據轉換並傳至顯示器顯示,而有關圖形的計算,都需要CPU去進行,CPU計算好後再依照指定的數據格式寫入規定的內存地址,當時的CPU的主頻也不夠高,顯示器的分辨率也不高,使得無法呈現足夠精緻的畫面。對比現代顯卡的設計,我們能夠切實認識到現代顯卡這樣的設計,確實是能夠極大提高計算機圖形能力的。

  對於學習OpenGL和計算機圖形學,有關顯卡的內容初步瞭解這些已經可以了。更多內容可以查閱相關資料瞭解。

顯示器

  顯示器(display)通常也被稱爲監視器(monitor),是一種可以將特定的輸入信號顯示成像的設備。根據製造材料的不同,可分爲:陰極射線管顯示器(CRT),等離子顯示器PDP,液晶顯示器LCD等等。更多資料詳見百度百科
在這裏插入圖片描述
在OpenGL編程中我們一般關心顯示的兩個參數,分辨率和刷新率。

分辨率

  顯示器的分辨率是指水平和豎直方向上的像素點數,單位是px。對於實際物理尺寸相同的顯示器,分辨率越高,能在屏幕上展示出的像素數就越多,同時單個像素點的尺寸會越小。我們常用水平方向上的像素是x豎直方向上的像素數的形式描述分辨率,例如俗稱的1080P分辨率的常見規格爲:1920x1080

這裏列出顯示器常見的分辨率:

常見分辨率大小
360P 480x360
600x360
720P 1280x720
1080P 1920x1080
2k 2560x1440
4k 4096x3112
3656x2664
3840x2160
8k 7680x4320

  屏幕刷新率是指每秒鐘屏幕刷新重新顯示內容的次數。這是一個概括的說法因爲不同材質的顯示器的具體做法往往不同。對於傳統顯示器來講,刷新頻率越低,圖像閃爍和抖動的就越厲害,眼睛疲勞得就越快。有時會引起眼睛痠痛。典型的刷新率有60Hz, 120Hz, 144Hz。而電競玩家一般追求更高的刷新率,例如240Hz,高刷新率的屏幕高屏幕刷新率對於電競遊戲的影響主要包含增加畫面流暢度、避免畫面撕裂、削弱因液晶屏幕拖影而產生的眩暈感。對於相同的分辨率,刷新率越高,那麼就要求顯示器的延遲越低,同時要求顯卡到顯示器的傳輸帶寬(每秒鐘傳輸的數據的比特數,常用單位Gbps,G比特每秒)越高。在圖形學編程中我們經常會令渲染到屏幕上的圖形的更新,與顯示器的刷新保持同步,這就是所謂的“垂直同步”。隨着技術的發展,近年來又出現了支持Free-Sync或者G-Sync的顯示器,他們可以動態調整顯示器的刷新頻率與顯卡輸出圖形的頻率保持一致。

顯示器的伽馬校正

作爲課外瞭解內容,參考這裏

自測題目&啓示

  • 分別用索引圖像和RGB圖像兩種形式,表示一張寬爲7像素,高爲7像素,以純藍色爲背景色,圖像中心一個寬度爲5,高度爲5的純綠色正方形的圖像。類似如圖:![在這裏插入圖片描述](https://img-blog.csdnimg.cn/20200202202901503.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM2MzIxMzg=,size_16,color_FFFFFF,t_70)
  • 簡述BMP圖片文件的特點與不足
  • 簡述JPEG(JPG)圖片文件的特點與不足
  • 簡述PNG圖片文件和JPEG(JPG)圖片文件的主要區別
  • 簡述顏色的不透明度分量A(alpha)的作用
  • 簡述爲什麼現代GPU的大規模並行計算能力有助於加速圖形計算
  • 爲什麼說要儘量避免在主存和顯存之間交換數據
  • 如果你的電腦支持並設置爲1080P(1920x1080)分辨率,刷新率爲120Hz,24位真彩色模式(位深度爲24),那麼理論上對你的顯卡到顯示器的帶寬的最低要求是多大?(題庫中有類似題目)
  • (開放題目)如果現在你要買一臺新電腦,結合你自己的需求(是學習辦公多,還是遊戲多,玩什麼類型的遊戲?)和經濟狀況,你會買哪一傢什麼型號的顯卡?
  • (開放題目)還是上一題的背景,你會買一臺怎樣的顯示器?
  • (開放題目)N卡好還是A卡好?(滑稽護體)
  • 發表評論
    所有評論
    還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
    相關文章