Pixi.js 渲染 Tilemap

2020.06.16

還是棄用Shader的方式了茫叭,用Graphics镊掖。Github


源碼
預覽

游戲開發(fā)中或多或少都有接觸過Tilemap,在Tiled編輯器里編輯好地圖之后钮蛛,導出數(shù)據(jù)仅颇,然后在游戲引擎(Cocos...)里就可以直接使用了,確實很方便。

由于Pixi.js自身并不支持Tilemap的解析渲染茎匠,所以我一直在嘗試了解背后的機制格仲。最初能想到的實現(xiàn)就是,在一個Container里放一堆Sprite把地圖拼出來汽抚,Pixi.jsTexture支持以一個BaseTexture為基礎(chǔ)抓狭,分塊讀取,所以實現(xiàn)一個也還可以造烁。代碼差不多就是這樣:

const rect = new PIXI.Rectangle(0, 0, this.square, this.square)
for (let i = 0, sn = 0; i < this.size.height; i++) {
    for (let j = 0; j < this.size.width; j++) {
        sn = this.data[i * this.size.width + j]
        if (!sn) continue
        sn--
        rect.x = (sn % this.tilesets.columns) * this.square
        rect.y = (~~(sn / this.tilesets.columns)) * this.square
        // 分塊讀取
        const tile = new PIXI.Sprite(new PIXI.Texture(this.tilesheet, rect))
        tile.position.set(j * this.square, i * this.square)
        tile.anchor.set(.5)
        this.addChild(tile)
    }
}

一天看到Pixi.js的作者在Codepen上的代碼后否过,于是有了今天這篇文章。

實現(xiàn)思路

上面是v5的實現(xiàn)惭蟋,v4實現(xiàn)起來略麻煩苗桂。

利用shader去渲染Tilemap。我們從Tilemap導出的JSON數(shù)據(jù)可以知道告组,主要的數(shù)據(jù)其實就是地圖元素(瓦片)在圖集中的索引煤伟。如何在著色器里拿到索引數(shù)據(jù)呢?

如果你看了上面Codepen的代碼木缝,或許你就知道了:

const bitmap = new PIXI.Graphics()

for (let i = 0; i < layer.height; i++) {
    for (let j = 0; j < layer.width; j++) {
        const
            index = layer.data[i * layer.width + j] - 1,
            column = this.mapData.tilesets[0].columns,
            x = index % column,
            y = Math.floor(index / column)
        bitmap.beginFill((x << 16) + (y << 8), index !== -1 ? 1 : 0)
        bitmap.drawRect(j, i, 1, 1)
        bitmap.endFill()
    }
}

// 生成紋理后面會傳入紋理單元 一定要設(shè)置:PIXI.SCALE_MODES.NEAREST
core.renderer.generateTexture(bitmap, PIXI.SCALE_MODES.NEAREST)

創(chuàng)建一個bitmap便锨,把地圖的索引數(shù)據(jù)變成顏色值儲存在這個bitmap里。

還需要一段著色器代碼:


precision mediump float;

uniform sampler2D tilesheet, bitmap;
uniform float tileSize, tileColumn;
uniform vec2 tilesheetSize;
varying vec2 vTextureCoord, vVertexPosition;

void main() {
    vec4 color = floor(texture2D(bitmap, vTextureCoord) * 255.0);

    if (color.a == 0.0) discard;

    vec2 coord = (vec2(color.r, color.g) * tileSize
        + mod(vVertexPosition, tileSize)) / tilesheetSize;

    gl_FragColor = texture2D(tilesheet, coord);
}

這里還有一些Pixi.js的操作我碟,我就不寫出來了放案。弄明白原理,就行矫俺。感覺和法線貼圖是一個道理吱殉,雖然我并沒有研究過。主要就是把索引數(shù)據(jù)變成紋理上傳到GPU厘托,然后在著色器代碼里讀取出來友雳。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市铅匹,隨后出現(xiàn)的幾起案子押赊,更是在濱河造成了極大的恐慌,老刑警劉巖包斑,帶你破解...
    沈念sama閱讀 211,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件流礁,死亡現(xiàn)場離奇詭異,居然都是意外死亡舰始,警方通過查閱死者的電腦和手機崇棠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,347評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來丸卷,“玉大人枕稀,你說我怎么就攤上這事。” “怎么了萎坷?”我有些...
    開封第一講書人閱讀 157,435評論 0 348
  • 文/不壞的土叔 我叫張陵凹联,是天一觀的道長。 經(jīng)常有香客問我哆档,道長蔽挠,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,509評論 1 284
  • 正文 為了忘掉前任瓜浸,我火速辦了婚禮澳淑,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘插佛。我一直安慰自己杠巡,他們只是感情好,可當我...
    茶點故事閱讀 65,611評論 6 386
  • 文/花漫 我一把揭開白布雇寇。 她就那樣靜靜地躺著氢拥,像睡著了一般。 火紅的嫁衣襯著肌膚如雪锨侯。 梳的紋絲不亂的頭發(fā)上嫩海,一...
    開封第一講書人閱讀 49,837評論 1 290
  • 那天,我揣著相機與錄音囚痴,去河邊找鬼叁怪。 笑死,一個胖子當著我的面吹牛渡讼,可吹牛的內(nèi)容都是我干的骂束。 我是一名探鬼主播耳璧,決...
    沈念sama閱讀 38,987評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼成箫,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了旨枯?” 一聲冷哼從身側(cè)響起蹬昌,我...
    開封第一講書人閱讀 37,730評論 0 267
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎攀隔,沒想到半個月后皂贩,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,194評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡昆汹,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,525評論 2 327
  • 正文 我和宋清朗相戀三年明刷,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片满粗。...
    茶點故事閱讀 38,664評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡辈末,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情挤聘,我是刑警寧澤轰枝,帶...
    沈念sama閱讀 34,334評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站组去,受9級特大地震影響鞍陨,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜从隆,卻給世界環(huán)境...
    茶點故事閱讀 39,944評論 3 313
  • 文/蒙蒙 一诚撵、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧键闺,春花似錦砾脑、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,764評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至购桑,卻和暖如春畅铭,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背勃蜘。 一陣腳步聲響...
    開封第一講書人閱讀 31,997評論 1 266
  • 我被黑心中介騙來泰國打工硕噩, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人缭贡。 一個月前我還...
    沈念sama閱讀 46,389評論 2 360
  • 正文 我出身青樓炉擅,卻偏偏與公主長得像,于是被迫代替她去往敵國和親阳惹。 傳聞我的和親對象是個殘疾皇子谍失,可洞房花燭夜當晚...
    茶點故事閱讀 43,554評論 2 349

推薦閱讀更多精彩內(nèi)容