植物大戰(zhàn)僵尸北美版使用RGBA32圖像教程
前面都是廢話,重點(diǎn)在專欄最后 眾所周知,植物大戰(zhàn)僵尸安卓北美版非常非常非常糊,色帶明顯,玩的時(shí)候就好像我們?cè)谕嫔蟼€(gè)世紀(jì)的游戲一樣。這是因?yàn)橹参锎髴?zhàn)僵尸北美版用到的圖片都是rgba4444/rgb565/rgba5551格式的,而一般的顯示器能顯示rgb888顏色。那么,有沒有什么辦法能在植物大戰(zhàn)僵尸北美版中實(shí)現(xiàn)rgba8888紋理呢? PopStudio編碼ptx圖像時(shí)可以選擇格式為0的ARGB8888格式(BGRA8888),但是一旦使用此格式打包數(shù)據(jù)包,在很多安卓設(shè)備上面就會(huì)出現(xiàn)黑屏的情況,但是在iOS設(shè)備卻不會(huì)有這種情況,植物大戰(zhàn)僵尸iPad版本身也就含有這種格式的圖像。這是為什么呢? 我使用ida對(duì)游戲進(jìn)行了反匯編,看到有兩處邏輯和紋理格式有關(guān),一個(gè)是將group附加給ResStreamsPool的時(shí)候創(chuàng)建空紋理,另一個(gè)是將ptx紋理“上色”到空紋理。這兩處邏輯大量使用OpenGL ES 2.0中的函數(shù),不過在植物大戰(zhàn)僵尸安卓版中這些都是虛函數(shù),沒有直接調(diào)用。這里可以看到調(diào)用glTexImage2D和glTexSubImage2D之前,有一步將ptx紋理格式轉(zhuǎn)為GPU紋理格式的操作,ptx0(BGRA8888)被解釋為GL_BGRA_EXT/GL_BGRA_IMG和GL_Byte,是ext或者img擴(kuò)展,所以必須由硬件支持才可以正常使用這種紋理。也就是說,黑屏的設(shè)備缺少這種硬件支持。 但是如果你了解pvz2,你會(huì)發(fā)現(xiàn)在pvz2安卓版中也有ptx0這種格式,對(duì)應(yīng)的紋理是popstudio中的ABGR8888(其實(shí)是RGBA8888),游戲中可以正常加載。對(duì)其進(jìn)行反匯編,發(fā)現(xiàn)ptx0被解釋為GL_RGBA和GL_Byte。 為什么pvz2安卓版不用BGRA8888而是用RGBA8888呢?這是因?yàn)?,RGBA8888紋理不需要額外的硬件支持,所有支持OpenGL ES 2.0的設(shè)備都支持。 所以我有一個(gè)思路,就是把植物大戰(zhàn)僵尸北美版加載紋理邏輯中的GL_BGRA_EXT換為GL_RGBA,讓植物大戰(zhàn)僵尸北美版可以像pvz2一樣將ptx0解釋為RGBA8888紋理。然后在popstudio中,生成ptx的時(shí)候,勾選設(shè)置中的ABGR8888選項(xiàng)。 對(duì)libpvz.so進(jìn)行如下兩處修改即可,然后使用popstudio打包rsb的時(shí)候勾選設(shè)置中的ARGB8888。 地址:0x3B392C 大小:8字節(jié) 原始數(shù)據(jù):81 3C A0 E3 1F 30 43 E2 修改數(shù)據(jù):19 3C A0 E3 08 30 83 E2 地址:0x3B42DC 大?。?字節(jié) 原始數(shù)據(jù):81 3C A0 E3 1F 30 43 E2 修改數(shù)據(jù):19 3C A0 E3 08 30 83 E2 其他植物大戰(zhàn)僵尸版本請(qǐng)自行根據(jù)本專欄所述原理去修改。