021. 現代顯卡之二

021. 現代顯卡之二

來自專欄 現代計算機

T&L

上一節曾說過,GPU的主要作用是把3D場景變成一個2D圖像。在沒有GPU的時候,這部分工作要麼由照像機來做,要麼由人眼來做。這裡涉及的主機是幾何學。 主要需要解決的問題為Transform, clipping and lignting, 簡稱T&L或TCL。

  1. Transform

即將一個3D物體變化為2D圖像,基本做法是投影,包括透視投影和垂直投影。 其實這裡面還會涉及把物體的「物體坐標」轉換成世界坐標,再轉換成「相機坐標」等。這涉及一系列矩陣變換。

  1. clipping

3D物體投影到2D平面上後,或是投影過程中,發現有一些部分是不應該被看見的,這時需要根據遮擋信息等把他們裁掉。

  1. lighting

光把3D物理投影到2D平面並不能給人們帶來足夠的真時感,甚至會投影成混亂一團像素,讓人看不懂倒底是什麼東西。因為投影的過程中缺少光照信息。同樣的幾何體,由於光照角度不同,材質不同,可能會顯示出非常不一樣的顏色,人眼需要這種顏色或灰度變化來區分物體間的位置關係。

在顯卡被發明之前,一些做遊戲的公司就已經發現了這套理論,1993年arcade公司就實現了能做T&L的硬體,1997年任天堂的遊戲機上也有了專門的T&L硬體。PC上由於人們認為PC的CPU性能足夠強大,所以很長一段時間內,大家都用軟體去實現T&L。直到1999年,nvidia的GeForce 256才引入硬體T&L支持。

本小節我們就來看看這段歷史。

RCP

RCP,即Reality Coprocessor, 是由Silicon Graphics公司為任天堂研發的。它包含兩部分,RSP和RDP,即Reality Signal Processor和Reality Display Processor。

RSP

RSP的主要做是幾何運算,對應的是T&L中的T和L。 RDP的主要作用是柵格化和紋理貼圖。

RSP是一顆MIPS CPU,它的固件實現了一個程序,這個程序可以讀取一個指令序列,解析指令序列中的指令並執行相應的指令。這些指令稱為微碼,micro code。程序員將一系列微碼組成一個列表,稱為display list或是command list。RSP則按照display list去執行。

RSP的微碼看起來像是C函數調用,但實際上它們可能是一些打包二進位比特流的宏。熟悉opengl的同學可能會覺得它們和opengl的API有點像。

其操作思路與opengl也是很相似的,先要指定一些頂點,一些變換矩陣,一些紋理,對應的api如下:

gsSPMatrix(Mtx *m, unsigned int p) gsSPVertex(Vtx *v, unsigned int n, unsigned int v0) gsSPTexture(int s, int t, int levels, int tile, int on) gsSPClipRatio(FRUSTRATIO_3),Lights3 light_structure1 = gdSPDefLights3( ambient_red, ambient_green, ambient_blue, light1red, light1green, light1blue, light1x, light1y, light1z, light2red, light2green, light2blue, light2x, light2y, light2z, light3red, light3green, light3blue, light3x, light3y, light3z);gsSPSetGeometryMode(G_LIGHTING),gsSPSetLights3(material1_light),gsSPVertex( /* define vertices for object 1 */ );/* render object 1 here */gsSPLight(&material2_light.l[0], LIGHT_1),gsSPLight(&material2_light.a, LIGHT_2),gsSPVertex( /* define vertices for object 2 */ );/* render object 2 here */guLookAtHilite(&throw_away_matrix, &lookat, &hilite, Eyex, Eyey, Eyez, Objectx, Objecty, Objectz, Upx, Upy, Upz, light1x, light1y, light1z, light2x, light2y, light2z, tex_width, tex_height);gsDPLoadTextureBlock_4b(hilight_texture, G_IM_FMT_I, tex_width, tex_height, 0, G_TX_WRAP | G_TX_NOMIRROR, G_TX_WRAP | G_TX_NOMIRROR, tex_width_power2, tex_height_power2, G_TX_NOLOD, G_TX_NOLOD),

具體的含義見: level42.ca/projects/ult

RCP的輸入是一些頂點、紋理坐標、光照條件等,輸出是多邊形。 這些多邊形進入RDP進行進一步處理。

RDP

Reality Display Processor。 它的作用是把多邊形進行柵格化,輸入為high-quality, Silicon Graphics style pixels that are textured, antialiased, and z-buffered.

聽起來的大致意思是這是一些像素,每個像素都已經映射了紋理,做了抗鋸齒,並且包含z緩衝即深度信息。與opengl裡面的fragment,片元幾乎是一回事兒。

RDP會按照固定的步驟處理這些片元。在某種模式下的步驟如下:

在這種模式下,它一個周期只能處理1個像素,在另一些模式下,它可以實現一個周期處理兩個像素。

RCP已經很像是一款固定流水線的GPU了,美中不足的是它的RSP部分是用MIPS處理器來做的,速度就慢了不少。

BlockFunctionalityRSGenerates pixel and its attribute covered by the interior of the primitive.TXGenerates 4 texels nearest to this pixel in a texture map.TFBilinear filters 4 texels into 1 texel,or performs step 1 of YUV-to-RGB conversion.CCCombines various colors into a single color,or performs step 2 of YUV-to-RGB conversion.BLBlends the pixel with framebuffer memory pixel, or fogs the pixel for writing to framebuffer.MIFetches and writes pixels from and to the framebuffer memory.

GeForce 256

這個GPU支持Direct3D 7。稱為世界上的第一個GPU。

Nvidia如些驕傲於這個晶元,已至於官網上還有它的鏈接:nvidia.com/page/geforce

這時GPU的定義為:a single-chip processor with integrated transform, lighting, triangle setup/clipping, and rendering engines that is capable of processing a minimum of 10 million polygons per second.

一秒鐘可以得處理1000萬個多邊形。

256的意思是」256位,4流水線渲染引擎「。相當於4核的GPU,一個周期可以處理4個像素。

與RCP不同的是,所有的處理都是硬邏輯完成的,而不是RCP那像由運行於CPU上的固件完成。

Nvidia不愧為世界上第一個GPU,它有現代GPU的所有特點:

  1. 硬體T&L
  2. 多核
  3. 支持一款3D API。

可以說硬體支持T&L是GPU和非GPU的分界點,Direct3D 7,是固定流水線GPU和非固定流水線分界點。當Direct3D 8出來的時候,vertex shader, fragment shader就已經有了,這時就是非固定流水線的GPU了。

太晚了,今天就寫到這裡。

發現一個好文章還沒讀完,供大家參考: techspot.com/article/65


推薦閱讀:

TAG:圖形處理器GPU | 顯卡 | AMD超微半導體 |