今天又發現了乙個華為手機專屬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_texture和load_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 sample和texture 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 apis選vulkan,我的華為手機也正常,好吧,我服了。
好了,拜拜!
微控制器 關於標頭檔案
開始寫微控制器的程式之後對於標頭檔案的使用一直沒能透徹理解,這裡歸納一些自己收集到的東西 標頭檔案裡常用的一些語句 1 ifdef 識別符號2 程式段1 3 else4 程式段2 5 endif 它的作用是 當識別符號已經被定義過 一般是用 define命令定義 則對程式段1進行編譯,否則編譯程式段...
《夜深了,你的手機關機了嗎》
夜深了,你的手機關機嗎?今天,朋友問我個問題,晚上的時候你關機嗎?不關機,那你是為誰呢?那天和朋友喝茶,她給我講起看過的乙個關於手機的故事 女孩每天臨睡會先關掉手機,然後把它放在寫字檯自己的相架前,這個習慣從買了手機的時候就這樣保持著。女孩有個很要好的男朋友,兩個人不見面的時候,就打打 或發發簡訊,...
華為手機鴻蒙系統手機 華為首部鴻蒙手機P50
華為如期上線了鴻蒙os2.0beta 版本手機系統。最初版本支援p40 mate 30系列和平板 matepad pro。所以如果你不是開發者,當前去放棄emui 11公升級測試版鴻蒙os沒有太大的意義。也得不到什麼新體驗。同時,華為高管也在發布會上暗示 鴻蒙os正式版最快將在p50上發布,並有可能...