提示
教程例子都可以到下面網(wǎng)址進(jìn)行運(yùn)行,不需要另外安裝軟件環(huán)境:
官方提供在線編寫(xiě)shader工具:https://thebookofshaders.com/edit.php
glslsandbox網(wǎng)站:http://glslsandbox.com/
shadertoy網(wǎng)站:https://www.shadertoy.com/
作者網(wǎng)站
https://thebookofshaders.com
源碼托管:
https://github.com/patriciogonzalezvivo/thebookofshaders
教程只提及最基礎(chǔ)的圖形以前的基礎(chǔ)教學(xué),淺顯易懂
運(yùn)行方式
CPU繪制需要對(duì)每個(gè)像素進(jìn)行單獨(dú)處理,分辨率 800x600下,一共480000個(gè)像素旦签,每秒30幀而咆,一秒鐘需要處理14400000次計(jì)算
GPU繪制是對(duì)所有的像素并行進(jìn)行像素處理摇肌,所以是一次性完成任務(wù)无午。 并行的處理器越多媒役,可以處理的數(shù)據(jù)流就越大。另一個(gè) GPU 的特點(diǎn)是數(shù)學(xué)函數(shù)可通過(guò)硬件加速宪迟。
GLSL是openGL Shading Language簡(jiǎn)稱酣衷,是opengl著色語(yǔ)言。
為什么shader不好學(xué)
GPU 的強(qiáng)大的架構(gòu)設(shè)計(jì)也有其限制與不足次泽。
優(yōu)點(diǎn) | 并行執(zhí)行穿仪,數(shù)學(xué)運(yùn)算硬件加速 |
---|---|
缺點(diǎn) | 每個(gè)線程的狀態(tài)和結(jié)果不可能提供給其他線程,你也控制不了它到底在渲染的是按鈕還是天空 |
為了能使許多管線并行運(yùn)行意荤,每一個(gè)線程必須與其他的相獨(dú)立啊片。我們稱這些線程對(duì)于其他線程在進(jìn)行的運(yùn)算是“盲視”的。這個(gè)限制就會(huì)使得所有數(shù)據(jù)必須以相同的方向流動(dòng)玖像。所以就不可能檢查其他線程的輸出結(jié)果紫谷,修改輸入的數(shù)據(jù),或者把一個(gè)線程的輸出結(jié)果輸入給另一個(gè)線程捐寥。
并且 GPU 會(huì)讓所有并行的微處理器(管道們)一直處在忙碌狀態(tài)碴里;只要它們一有空閑就會(huì)接到新的信息。一個(gè)線程不可能知道它前一刻在做什么上真。它可能是在畫(huà)操作系統(tǒng)界面上的一個(gè)按鈕咬腋,然后渲染了游戲中的一部分天空,然后顯示了一封 email 中的一些文字睡互。每個(gè)線程不僅是“盲視”的根竿,而且還是“無(wú)記憶”的。同時(shí)就珠,它要求編寫(xiě)一個(gè)通用的規(guī)則寇壳,依據(jù)像素的不同位置依次輸出不同的結(jié)果。
關(guān)于shader開(kāi)發(fā)
它不同于以往的順序/線性邏輯妻怎,更多的考慮到對(duì)整體的控制能力壳炎,以及對(duì)數(shù)學(xué)/幾何/矩陣的理解,這些都是不可或缺的逼侦,希望你會(huì)在接下來(lái)的學(xué)習(xí)能豐富你的知識(shí)匿辩。
在接下來(lái)的章節(jié)中,我們會(huì)一步一步地榛丢,由淺入深地學(xué)習(xí)著色語(yǔ)言铲球。