華為手機(jī)關(guān)于LOAD_TEXTURE2D的Bug

一個(gè)華為手機(jī)專屬Bug

今天又發(fā)現(xiàn)了一個(gè) 華為手機(jī) 專屬bug华畏,如下圖:

screenshot1.jpg

原本 LUX 表現(xiàn)正常的水在我的 華為 Meta 30 上表現(xiàn)呈 條帶狀鉴竭。

從表現(xiàn)上看跟 深度計(jì)算 相關(guān),定位了一下原因宜猜,發(fā)現(xiàn)問題代碼如下:

#if defined(SHADER_API_GLES)
    float refractedSceneDepth = SAMPLE_DEPTH_TEXTURE_LOD(_CameraDepthTexture, sampler_CameraDepthTexture, screenUV + offset, 0);
#else
    float refractedSceneDepth = LOAD_TEXTURE2D_X(_CameraDepthTexture, _CameraDepthTexture_TexelSize.zw * saturate(screenUV + offset) * 0.9999f ).x;
#endif

SHADER_API_GLES 代表的是 gles2.0 設(shè)備,走的是 SAMPLE_TEXUTRE 的分支硝逢。

而我們工程的 Graphics APIs 首選項(xiàng)是 OpenGLES3姨拥,并且我的華為手機(jī)也支持,所以最終代碼走的是 LOAD_TEXTURE 這個(gè)分支渠鸽。

Texture Sample Vs Texture Load

那么 SAMPLE_TEXTURELOAD_TEXTURE2D 有什么區(qū)別呢叫乌?

GLES3.0 代碼為例:

#define SAMPLE_DEPTH_TEXTURE_LOD(textureName, samplerName, coord2, lod)    SAMPLE_TEXTURE2D_LOD(textureName, samplerName, coord2, lod).r
#define LOAD_TEXTURE2D(textureName, unCoord2)    textureName.Load(int3(unCoord2, 0))

關(guān)于 Texture SampleTexture Load 的差別,可以參考這個(gè)帖子:Difference between texture.Sample and texture.Load徽缚,簡(jiǎn)單來說憨奸,兩者差別如下:

  • Texture Sample是紋理采樣,會(huì)應(yīng)用 紋理尋址紋理過濾凿试。

  • Texture Load只是加載某一個(gè)特定位置的 texel排宰。

道理上,作者希望 gles3.0 以上的設(shè)備都用 LOAD_TEXTURE 的方式來獲取深度值红省,但是偏偏遇到華為手機(jī)就跪了额各。

原因

華為手機(jī)的 浮點(diǎn)數(shù) 問題我不是第一次遇到了,之前也寫過吧恃,https://baddogzz.github.io/2020/04/27/Mali-Float-Presion/虾啦。

這次這個(gè)問題應(yīng)該還是浮點(diǎn)數(shù)計(jì)算的問題,使用 Texture Load 方式,我們需要根據(jù) UV坐標(biāo) 計(jì)算出 texel坐標(biāo)傲醉,代碼如下:

_CameraDepthTexture_TexelSize.zw * saturate(screenUV + offset) * 0.9999f

如果 texel坐標(biāo) 超出紋理范圍蝇闭,LOAD_TEXTURE2D 會(huì)返回 0

針對(duì)這種情況硬毕,作者已經(jīng)對(duì) screenUV + offset 做了 saturate 保護(hù)并且還乘了 0.9999f呻引,想必也是為了規(guī)避浮點(diǎn)數(shù)計(jì)算的誤差,但是華為手機(jī)依然還是跪了吐咳。

修正

修正的方式也簡(jiǎn)單逻悠,這里不再區(qū)分 SHADER_API_GLES,統(tǒng)一走 SAMPLE_TEXTURE 即可韭脊,如下:

float refractedSceneDepth = SAMPLE_DEPTH_TEXTURE_LOD(_CameraDepthTexture, sampler_CameraDepthTexture, screenUV + offset, 0);

這樣改之后童谒,我的 Meta 30 終于正常了,如下圖:

screenshot2.jpg

此外沪羔,我發(fā)現(xiàn)如果 Graphics APIsVulkan饥伊,我的華為手機(jī)也正常,好吧蔫饰,我服了琅豆。

個(gè)人主頁

本文的個(gè)人主頁鏈接:https://baddogzz.github.io/2020/10/19/HW-LoadX-Bug/

好了篓吁,拜拜茫因!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市越除,隨后出現(xiàn)的幾起案子节腐,更是在濱河造成了極大的恐慌,老刑警劉巖摘盆,帶你破解...
    沈念sama閱讀 206,482評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件翼雀,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡孩擂,警方通過查閱死者的電腦和手機(jī)狼渊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來类垦,“玉大人狈邑,你說我怎么就攤上這事≡槿希” “怎么了米苹?”我有些...
    開封第一講書人閱讀 152,762評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)砰琢。 經(jīng)常有香客問我蘸嘶,道長(zhǎng)良瞧,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,273評(píng)論 1 279
  • 正文 為了忘掉前任训唱,我火速辦了婚禮褥蚯,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘况增。我一直安慰自己赞庶,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評(píng)論 5 373
  • 文/花漫 我一把揭開白布澳骤。 她就那樣靜靜地躺著歧强,像睡著了一般。 火紅的嫁衣襯著肌膚如雪为肮。 梳的紋絲不亂的頭發(fā)上誊锭,一...
    開封第一講書人閱讀 49,046評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音弥锄,去河邊找鬼。 笑死蟆沫,一個(gè)胖子當(dāng)著我的面吹牛籽暇,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播饭庞,決...
    沈念sama閱讀 38,351評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼戒悠,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了舟山?” 一聲冷哼從身側(cè)響起绸狐,我...
    開封第一講書人閱讀 36,988評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎累盗,沒想到半個(gè)月后寒矿,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,476評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡若债,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評(píng)論 2 324
  • 正文 我和宋清朗相戀三年符相,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蠢琳。...
    茶點(diǎn)故事閱讀 38,064評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡啊终,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出傲须,到底是詐尸還是另有隱情蓝牲,我是刑警寧澤,帶...
    沈念sama閱讀 33,712評(píng)論 4 323
  • 正文 年R本政府宣布泰讽,位于F島的核電站例衍,受9級(jí)特大地震影響昔期,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜肄渗,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評(píng)論 3 307
  • 文/蒙蒙 一镇眷、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧翎嫡,春花似錦欠动、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至圈驼,卻和暖如春人芽,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背绩脆。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評(píng)論 1 262
  • 我被黑心中介騙來泰國打工萤厅, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人靴迫。 一個(gè)月前我還...
    沈念sama閱讀 45,511評(píng)論 2 354
  • 正文 我出身青樓惕味,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國和親玉锌。 傳聞我的和親對(duì)象是個(gè)殘疾皇子名挥,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評(píng)論 2 345