華為手機關於LOAD TEXTURE2D的Bug

2021-10-24 23:30:38 字數 2409 閱讀 3437

今天又發現了乙個華為手機專屬bug,如下圖:

原本 lux 表現正常的水在我的華為 meta 30上表現呈條帶狀

#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裝置,走的是sample_texutre的分支。

而我們工程的graphics apis首選項是opengles3,並且我的華為手機也支援,所以最終**走的是load_texture這個分支。

那麼sample_textureload_texture2d有什麼區別呢?

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))
關於texture sampletexture load的差別,可以參考這個帖子:difference between texture.sample and texture.load,簡單來說,兩者差別如下:

道理上,作者希望gles3.0以上的裝置都用load_texture的方式來獲取深度值,但是偏偏遇到華為手機就跪了。

華為手機的浮點數問題我不是第一次遇到了,之前也寫過,

這次這個問題應該還是浮點數計算的問題,使用texture load方式,我們需要根據uv座標計算出texel座標,**如下:

_cameradepthtexture_texelsize.zw * saturate(screenuv + offset) * 0.9999f
如果texel座標超出紋理範圍,load_texture2d會返回0

針對這種情況,作者已經對screenuv + offset做了saturate保護並且還乘了0.9999f,想必也是為了規避浮點數計算的誤差,但是華為手機依然還是跪了。

修正的方式也簡單,這裡不再區分shader_api_gles,統一走sample_texture即可,如下:

float refractedscenedepth = sample_depth_texture_lod(_cameradepthtexture, sampler_cameradepthtexture, screenuv + offset, 0);
這樣改之後,我的meta 30終於正常了,如下圖:

此外,我發現如果graphics apisvulkan,我的華為手機也正常,好吧,我服了。

好了,拜拜!

微控制器 關於標頭檔案

開始寫微控制器的程式之後對於標頭檔案的使用一直沒能透徹理解,這裡歸納一些自己收集到的東西 標頭檔案裡常用的一些語句 1 ifdef 識別符號2 程式段1 3 else4 程式段2 5 endif 它的作用是 當識別符號已經被定義過 一般是用 define命令定義 則對程式段1進行編譯,否則編譯程式段...

《夜深了,你的手機關機了嗎》

夜深了,你的手機關機嗎?今天,朋友問我個問題,晚上的時候你關機嗎?不關機,那你是為誰呢?那天和朋友喝茶,她給我講起看過的乙個關於手機的故事 女孩每天臨睡會先關掉手機,然後把它放在寫字檯自己的相架前,這個習慣從買了手機的時候就這樣保持著。女孩有個很要好的男朋友,兩個人不見面的時候,就打打 或發發簡訊,...

華為手機鴻蒙系統手機 華為首部鴻蒙手機P50

華為如期上線了鴻蒙os2.0beta 版本手機系統。最初版本支援p40 mate 30系列和平板 matepad pro。所以如果你不是開發者,當前去放棄emui 11公升級測試版鴻蒙os沒有太大的意義。也得不到什麼新體驗。同時,華為高管也在發布會上暗示 鴻蒙os正式版最快將在p50上發布,並有可能...