数据的流动——计算机是如何显示一个像素的
在計(jì)算機(jī)內(nèi)部是怎么把一張照片顯示到屏幕上的呢?
對(duì)于這個(gè)問(wèn)題一直很好奇,這應(yīng)該是也是圖形學(xué)的一個(gè)最基礎(chǔ)的問(wèn)題吧。沒(méi)上過(guò)計(jì)算機(jī)組成原理課,只好自行百度谷歌~ 發(fā)現(xiàn)網(wǎng)上的答案大多不完整,前段時(shí)間順著問(wèn)題一直搜索,從計(jì)算機(jī)的發(fā)明到顯示器成像后來(lái)又到了電路,后來(lái)甚至工業(yè)革命的發(fā)展史,根本停不下來(lái),有了一個(gè)主題后看歷史也是真挺有意思的。在這里將我的理解大概記下來(lái),不求細(xì)節(jié)精確,只求完整易懂。
一個(gè)從編程/輸入設(shè)備輸入到顯示器顯示到人眼的完整過(guò)程。分為幾個(gè)階段:(應(yīng)用程序/輸入設(shè)備產(chǎn)生)數(shù)據(jù)與指令——>CPU——>顯卡驅(qū)動(dòng)程序——>顯卡——>顯示器——>人眼。
讓我們從尾端倒著看起。先說(shuō)顯示器顯示與人眼混色的原理。
一、顯示器階段
1.1、顯像原理
拿常見(jiàn)的液晶顯示器舉例,顯示器是的底部是一塊發(fā)光白板燈,中間液晶,然后是一些濾光片。顯示器的屏幕是由很多個(gè)“小塊”組成的,每塊后面都有紅綠藍(lán)三個(gè)濾光片,每個(gè)小塊就是1個(gè)像素點(diǎn)。濾光片能夠把顯示器背后發(fā)出的白光過(guò)濾,留下單色光通過(guò),白光經(jīng)過(guò)三塊濾光片后被分解成了紅綠藍(lán)三束光,進(jìn)入人的眼睛。由于一個(gè)像素極其小,三個(gè)濾光片距離極其近,以至于透過(guò)它們的光進(jìn)入人眼后,人眼分不清這是3束光,即光在人眼中發(fā)生混色作用,于是一個(gè)像素便“有了”顏色。這3束光強(qiáng)度如果一致的話,混色后人眼將會(huì)看到白色光,而想要看到五顏六色的話,混合前的紅綠藍(lán)三束光應(yīng)該具有不同強(qiáng)度(亮度),如何獲得不同亮度的三色光呢?這就是液晶作用了。
這里插一句,可能你會(huì)問(wèn)光的三原色為什么是紅綠藍(lán)而不是紫色、粉色、或者屎黃色呢?是因?yàn)槿祟惖囊暰W(wǎng)膜上面的視錐細(xì)胞對(duì)紅綠藍(lán)三色最敏感,可能不同的人看見(jiàn)的世界顏色還真不一樣。這有點(diǎn)生物學(xué)了。
說(shuō)回液晶,液晶不是固態(tài),也不是液態(tài),而是一種中間的狀態(tài)。其分子在電壓的控制下,形成不同的排列方式,所以可以控制光線的透過(guò),形成不同明暗程度的畫(huà)面。這是一個(gè)非常重要的步驟,如果只能形成一明一暗是構(gòu)成不了畫(huà)面的.不管是顯示器還是投影機(jī),其實(shí)都是按這個(gè)原理進(jìn)行顯示的。當(dāng)然如果只是進(jìn)行了上述的過(guò)程,形成的畫(huà)面僅僅是黑白畫(huà)面,因?yàn)橥高^(guò)液晶分子的光線并沒(méi)有顏色,需要濾色片來(lái)“上色”。
有了光、有了人眼、有了濾光片、有了液晶,還差什么?當(dāng)然是電,液晶控制光線通過(guò)的程度是由加在液晶上的電壓強(qiáng)弱來(lái)控制的?,F(xiàn)在我們知道了向顯示器輸入一定規(guī)律的電壓信號(hào)能夠控制液晶按一定規(guī)律排列,來(lái)控制紅綠藍(lán)RGB顏色分量,繼而顯示出特定顏色。
1.2、數(shù)模轉(zhuǎn)換
由于電壓信號(hào)是連續(xù)變化的(舉個(gè)栗子,從200變?yōu)?01是連續(xù)變化的,而不是跳躍地一下子從200變?yōu)?01),而我們知道計(jì)算機(jī)只認(rèn)識(shí)0和1,內(nèi)部是由0和1二進(jìn)制來(lái)表示的,表示的數(shù)據(jù)是離散化的(從200跳躍到201),前者我們稱之為模擬信號(hào),后者稱為數(shù)字信號(hào)。把承載有計(jì)算機(jī)數(shù)據(jù)的數(shù)字信號(hào)轉(zhuǎn)為顯示器用的模擬信號(hào),這個(gè)過(guò)程就是數(shù)模轉(zhuǎn)換了,而執(zhí)行這個(gè)過(guò)程的設(shè)備,就是顯卡了。
此外,簡(jiǎn)單直觀地理解下,計(jì)算機(jī)內(nèi)電路是靠高電平和低電平來(lái)表示0和1的,還有就是靠脈沖發(fā)送數(shù)字信號(hào)。
二、顯卡階段
2.1 顯卡硬件
關(guān)于顯卡,這里直接引用下百度百科:
顯卡全稱顯示接口卡,又稱顯示適配器,是計(jì)算機(jī)最基本配置、最重要的配件之一。顯卡作為電腦主機(jī)里的一個(gè)重要組成部分,是電腦進(jìn)行數(shù)模信號(hào)轉(zhuǎn)換的設(shè)備,承擔(dān)輸出顯示圖形的任務(wù)。顯卡接在電腦主板上,它將電腦的數(shù)字信號(hào)轉(zhuǎn)換成模擬信號(hào)讓顯示器顯示出來(lái),同時(shí)顯卡還是有圖像處理能力,可協(xié)助CPU工作,提高整體的運(yùn)行速度。
數(shù)據(jù)從離開(kāi)CPU到達(dá)顯示屏,中間必須通過(guò)如下4個(gè)步驟:
1.從總線進(jìn)入GPU(圖形處理器):將CPU送來(lái)的數(shù)據(jù)送到北橋,再送到GPU里面進(jìn)行處理。
2.將芯片處理完的數(shù)據(jù)送到顯存。
3.從顯存讀取出數(shù)據(jù)再送到隨機(jī)讀寫存儲(chǔ)數(shù)—模轉(zhuǎn)換器進(jìn)行數(shù)模轉(zhuǎn)換的工作。(但是如果是DVI接口類型的顯卡,則不需要經(jīng)過(guò)數(shù)字信號(hào)轉(zhuǎn)模擬信號(hào)。而直接輸出數(shù)字信號(hào)。)
4.從DAC進(jìn)入顯示器:將轉(zhuǎn)換完的模擬信號(hào)送到顯示屏。
顯卡就是起數(shù)據(jù)處理和數(shù)模轉(zhuǎn)換的作用,像數(shù)模轉(zhuǎn)換、模數(shù)轉(zhuǎn)換這些都是數(shù)字信號(hào)處理、數(shù)字電路之類的學(xué)科的知識(shí)了。
以上便是CPU到顯卡再到顯示器再到人眼的過(guò)程。不過(guò)這其中還有一點(diǎn),顯卡有不同類型,內(nèi)部工作原理不盡相同,而同一個(gè)操作系統(tǒng)可以安裝在不同顯卡的機(jī)器上,如何識(shí)別它們,讓不同顯卡都能在此操作系統(tǒng)下正常工作,需要一個(gè)在操作系統(tǒng)與(顯卡)硬件間溝通者的角色,這個(gè)就是(顯卡)驅(qū)動(dòng)程序了。
2.2 顯卡驅(qū)動(dòng)
它是硬件廠商根據(jù)操作系統(tǒng)編寫的配置文件,是添加到操作系統(tǒng)中的一小塊代碼,其中包含有關(guān)硬件設(shè)備的信息。驅(qū)動(dòng)程序扮演溝通的角色,把硬件的功能告訴操作系統(tǒng),并且也將系統(tǒng)的指令傳達(dá)給硬件,讓它開(kāi)始工作。
這一塊偏硬件我就沒(méi)有深究了,我的理解就是CPU通過(guò)操作系統(tǒng)中相應(yīng)顯卡驅(qū)動(dòng)程序訪問(wèn)操縱顯卡,向顯存寫入數(shù)據(jù)。這一塊知乎上有許多相關(guān)問(wèn)題。
鏈接1:顯卡、顯卡驅(qū)動(dòng)、cuda 之間的關(guān)系是什么? - 冬瓜哥的回答 - 知乎
顯卡驅(qū)動(dòng),分內(nèi)核態(tài)和用戶態(tài)兩部分。內(nèi)核態(tài)驅(qū)動(dòng)只管將用戶態(tài)驅(qū)動(dòng)發(fā)過(guò)來(lái)的命令和數(shù)據(jù)準(zhǔn)備好,通知GPU來(lái)拿,利用環(huán)形fifo來(lái)下發(fā)命令和數(shù)據(jù)指針,并追蹤命令的完成狀態(tài)。用戶態(tài)部分,負(fù)責(zé)對(duì)shader程序的編譯,編譯成GPU的二進(jìn)制代碼指令。OS提供的D3D,OpenGL等函數(shù)庫(kù),屏蔽底層不同顯卡的差異。上層程序比如游戲,在準(zhǔn)備好對(duì)應(yīng)的模型、貼圖紋理、著色器程序等數(shù)據(jù)之后,調(diào)用統(tǒng)一的D3D/OpenGL接口發(fā)起繪制請(qǐng)求,D3D則調(diào)用顯卡用戶態(tài)驅(qū)動(dòng)提供的回調(diào)函數(shù)將對(duì)應(yīng)的數(shù)據(jù)傳遞給后者,后者進(jìn)行運(yùn)行時(shí)編譯生成底層代碼,然后傳遞給內(nèi)核態(tài)驅(qū)動(dòng),內(nèi)核態(tài)驅(qū)動(dòng)將命令和數(shù)據(jù)發(fā)送給GPU。至于GPU怎么算的,那就是完全另外一回事了。
鏈接2:計(jì)算機(jī)底層是如何訪問(wèn)顯卡的?
以上部分便是將CPU里面的數(shù)據(jù)傳遞到人眼的過(guò)程。計(jì)算機(jī)如何顯示的問(wèn)題已經(jīng)解決了,本文主要內(nèi)容到這里應(yīng)該就要結(jié)束了的,但是為了完整性…咳,接下來(lái)部分就接著講CPU是怎樣獲取數(shù)據(jù)的。分為輸入設(shè)備和應(yīng)用程序兩種情況來(lái)說(shuō)。
三、數(shù)據(jù)輸入
3.1 鍵盤
先放一張圖片↓
?
計(jì)算機(jī)通過(guò)一系列輸入設(shè)備來(lái)獲取數(shù)據(jù)。獲取圖片可以用掃描儀、數(shù)碼相機(jī)等,獲取聲音可以用麥克風(fēng)、獲取文字可以通過(guò)鍵盤,而這些設(shè)備的作用最終都是將這些數(shù)據(jù)轉(zhuǎn)換為數(shù)字信號(hào)。計(jì)算機(jī)內(nèi)只存在0和1,因此,無(wú)論是圖片、文字還是聲音等,理論上計(jì)算機(jī)的一切的數(shù)據(jù)、指令等都可以通過(guò)鍵盤輸入來(lái)獲得(見(jiàn)上圖~)。
參考鏈接: 鍵盤基本工作原理_圖文_百度文庫(kù)
計(jì)算機(jī)鍵盤通常采用行列掃描法來(lái)確定按下鍵所在的行列位置。所謂行列掃描法是指,把鍵盤按鍵排列成n行×m列的n*m行列點(diǎn)陣,把行、列線分別連接到兩個(gè)
并行接口雙向傳送的連接線上,點(diǎn)陣上的鍵一旦被按動(dòng),該鍵所在的行列點(diǎn)陣信號(hào)就被認(rèn)為已接通。按鍵所排列成的矩陣,需要用硬件或軟件的方法輪轉(zhuǎn)順序地對(duì)其行、列分別進(jìn)行掃描,以查詢和確認(rèn)是否有鍵按動(dòng)。如有鍵按動(dòng),鍵盤就會(huì)向主機(jī)發(fā)送被按鍵所在的行列點(diǎn)陣的位置編碼,稱為鍵掃描碼。單片機(jī)通過(guò)周期性掃描行、列線,讀回掃描信號(hào)結(jié)果,判斷是否有鍵按下,并計(jì)算按鍵的位置以獲得掃描碼。鍵被按下時(shí),單片機(jī)分兩次將位置掃描碼發(fā)送到鍵盤接口:按下一次,叫接通掃描碼;按完釋放一次,叫斷開(kāi)掃描碼。這樣,通過(guò)硬件或軟件的方法對(duì)鍵盤分別進(jìn)行行、列掃視,就可以確定按下鍵所在位置,獲得并輸出掃描位置碼,然后轉(zhuǎn)換為ASCII碼,經(jīng)過(guò)鍵盤I/O電路送入主機(jī),并由顯示器顯示出來(lái)。
于是從理論上,我可以用上圖的這種鍵盤按照一定的編碼敲出一長(zhǎng)串0、1數(shù)字序列,再加一個(gè)jpg/png的后綴名保存。打開(kāi)文件時(shí),是將這些數(shù)據(jù)送入內(nèi)存,圖片查看程序控制CPU,根據(jù)后綴名對(duì)數(shù)據(jù)進(jìn)行解碼、解壓后得到圖像本身的數(shù)據(jù)——每個(gè)像素的RGB等。再歷經(jīng)前面所述的一大串過(guò)程,CPU的數(shù)據(jù)再經(jīng)過(guò)顯卡和顯示器,最終我就能看到一張滑稽的照片。(#滑稽)
?
上面介紹了如何直接獲取具體的數(shù)據(jù)并呈現(xiàn)。在現(xiàn)實(shí)中,我們不太可能用鍵盤一像素一像素地敲出一副圖片來(lái)(←這句刪除)。當(dāng)然也可以,而且是個(gè)學(xué)入門圖形學(xué)的好思路,參考:極簡(jiǎn)的 PNG 編碼函數(shù) svpng()
有種圖像格式叫ppm,很簡(jiǎn)單,無(wú)壓縮,可以直接開(kāi)個(gè)記事本寫好圖像長(zhǎng)寬顏色深度,然后就是各像素的rgb值,挨著寫完后,保存為ppm后綴,就可以圖像查看軟件查看咯,即用鍵盤敲了一張可以顯示的圖片出來(lái)??梢钥吹?#xff0c;雖然鍵盤產(chǎn)生了數(shù)據(jù),但是如果要顯示到屏幕上,還是得通過(guò)程序?qū)?shù)據(jù)送到CPU。
3.2 應(yīng)用程序
除了我們直接用拍照的方式記錄下一副圖片的信息之外,還有另一種主要的方式,就是通過(guò)計(jì)算機(jī)程序。畢竟,計(jì)算機(jī)不是照相機(jī)。
例如,寫了一個(gè)程序,實(shí)現(xiàn)了在屏幕畫(huà)一條線,或者顯示一個(gè)圓柱體,或者顯示一個(gè)怪物模型。本質(zhì)上我們都是要獲得表示一幅二維圖像的一串0和1的數(shù)字,而我們知道的一些數(shù)據(jù),例如線段長(zhǎng)度、圓柱體的半徑高度、怪物表面部分點(diǎn)的坐標(biāo)、我們從什么角度來(lái)觀察這些物體,那么,怎樣獲得這幅圖像的信息呢?這就是圖形學(xué)的范疇了。
但本質(zhì)上,圖形學(xué)的API底層都會(huì)提供一個(gè)類似于drawPixel(int x, int y, Color color)的接口,用于實(shí)現(xiàn)將屏幕坐標(biāo)為(x,y)的像素點(diǎn)顏色設(shè)置為color的功能。
四、結(jié)語(yǔ)
簡(jiǎn)單來(lái)說(shuō),這個(gè)過(guò)程就是:在操作系統(tǒng)與硬件驅(qū)動(dòng)程序的幫助下,用戶通過(guò)輸入設(shè)備或者程序向計(jì)算機(jī)CPU發(fā)送一系列的數(shù)據(jù),這些數(shù)字信號(hào)再經(jīng)過(guò)顯卡變?yōu)椴粩嘧兓碾妷耗M信號(hào),電壓控制了液晶的濾光性,像素背后的白光被分成了強(qiáng)弱不同的三原色光,再經(jīng)人眼的混色作用使得一個(gè)像素具有了千變?nèi)f化的顏色。
本文力求過(guò)程的完整性,不追求細(xì)節(jié)的完整性。其實(shí)上過(guò)相關(guān)計(jì)算機(jī)、機(jī)電之類專業(yè)課的應(yīng)該都知道這些東西。另外像GPU計(jì)算,shader這些我也就略過(guò)了。如果你也和我一樣有著同樣的疑惑,看過(guò)這篇文章后有了直觀完整的認(rèn)識(shí),我自認(rèn)為本文目的達(dá)到了,畢竟很多地方描述的不夠?qū)I(yè)準(zhǔn)確。錯(cuò)誤之處也請(qǐng)指正~
P.S. 推薦書(shū)《編碼,隱匿在計(jì)算機(jī)軟硬件背后的語(yǔ)言》,這本書(shū)用通俗易懂的語(yǔ)言加上海量的配圖,從編碼說(shuō)起,到搭建各種邏輯電路,再到一個(gè)CPU,最后到一個(gè)計(jì)算機(jī)。所以它又名:如何造一臺(tái)計(jì)算機(jī)。計(jì)算機(jī)本來(lái)沒(méi)有計(jì)算力,它只是一臺(tái)機(jī)器,通電后在這種狀態(tài)下,哪些電路應(yīng)該連通,哪些“電燈”應(yīng)該點(diǎn)亮,哪些電平應(yīng)該高應(yīng)該低,狀態(tài)變了,電路的結(jié)果也變了,僅此而已。是我們?nèi)?#xff0c;人為地規(guī)定,比如一組“帶編號(hào)的電燈”(可能是4個(gè)也可能是8個(gè),由人來(lái)約定好)以這樣的亮熄順序出現(xiàn)的話,就是2333這個(gè)數(shù),以另一種順序出現(xiàn)的話又是6666這個(gè)數(shù),都是來(lái)自于人規(guī)定的一套解釋,這里的解釋就是編碼,A這套編碼規(guī)則規(guī)定2333這個(gè)數(shù)在別的編碼里就是250…
總之,計(jì)算機(jī)只認(rèn)識(shí)電路,一些都是我們對(duì)電路結(jié)果的解釋…
參考:
- 計(jì)算機(jī)圖形學(xué) peter shirly
- 原來(lái)是黑白世界 液晶顯示原理你了解嗎_明基液晶顯示器_液晶顯示器應(yīng)用技術(shù)-中關(guān)村在線
- 顯卡_百度百科
- 操作系統(tǒng)、驅(qū)動(dòng)和硬件的關(guān)系的思考 - 十二先生的博客 - CSDN博客
- 鍵盤基本工作原理_圖文_百度文庫(kù)
總結(jié)
以上是生活随笔為你收集整理的数据的流动——计算机是如何显示一个像素的的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 从钉钉到金蝶云星空通过接口配置打通数据
- 下一篇: 好看有个性的轻量级可配置网站导航源码 可