ShaderToy奇巧:液晶顯示邏輯

在瀏覽ShaderToy上的無限圖書館的過程中,我發(fā)現(xiàn)對(duì)于圖書館的每一層,都會(huì)有相應(yīng)的編號(hào):

我想看看它是怎么實(shí)現(xiàn)的,結(jié)果發(fā)現(xiàn)代碼沒啥注釋,而且?guī)讉€(gè)無限圖書館的代碼都一模一樣,你抄我我抄你。最重要的是還有bug,沒辦法只能自己分析然后改好了。
找到最后有個(gè)核心函數(shù)ShowDig,傳入2D坐標(biāo),和要顯示的0-9數(shù)字,就能返回是否在顯示范圍內(nèi)。跟電梯液晶屏一樣。如果要顯示數(shù)字8,大概是這樣子:

由于在著色范圍內(nèi)的點(diǎn)都返回1,于是就可以用于著色判斷了:
會(huì)顯示一個(gè)綠色的8。
那我們來看這個(gè)神奇的函數(shù)是怎么實(shí)現(xiàn)的:
經(jīng)過分析,DigSeg用來畫液晶的小長(zhǎng)方塊,DSG表示如果當(dāng)前k為奇數(shù),就畫當(dāng)前小塊。
ShowDig中,vp,vm,vo分別是液晶中心點(diǎn)到各個(gè)小長(zhǎng)方塊中心點(diǎn)的偏移,由于對(duì)稱關(guān)系,所以只需要寫3個(gè)。
??? 于是關(guān)鍵來了,k是什么,從0-9對(duì)應(yīng)的那些magic number:119,36,93...又是什么。
??? 由DSG想到輾轉(zhuǎn)相除法,想到二進(jìn)制。測(cè)試了一下,沒錯(cuò)了。
????以數(shù)字1為例,它對(duì)應(yīng)36,36輾轉(zhuǎn)相除,也就是2進(jìn)制轉(zhuǎn)換為100100

??? 由于液晶屏上只有7個(gè)小塊,所以我們補(bǔ)齊為0100100,如果用自然數(shù),從高位開始數(shù),那么意思是2,5號(hào)塊需要顯示。根據(jù)倒數(shù)2,3行DSG代碼內(nèi)容,可以得到液晶小塊的順序關(guān)系如上圖黃色所示,那么2,5號(hào)亮起,的確是數(shù)字1的樣子。
??? 額外的,如果傳入-1,用4號(hào)塊亮起,當(dāng)作負(fù)數(shù)的符號(hào)。
??? 至此,我們能顯示單個(gè)數(shù)字0-9和負(fù)號(hào)了。
??? 由于shadertoy上的函數(shù)有問題,所以我只能寫點(diǎn)邏輯,顯示十進(jìn)制數(shù):
測(cè)試成功:

利用類似的邏輯,我們不僅可以設(shè)計(jì)液晶屏,還可以設(shè)計(jì)點(diǎn)陣,畫一些ASCII符號(hào):

分析起來簡(jiǎn)單,但是實(shí)際自己要做,對(duì)于我來說不是很容易,因?yàn)闆]有”那種“思維。也許我應(yīng)該多玩玩《SHENZHEN IO》
