【厚積薄發】線性空間下,如何處理GrabTexture顯示過亮的情況?

2021-01-10 侑虎科技

這是第124篇UWA技術知識分享的推送。今天我們繼續為大家精選了若干和開發、優化相關的問題,建議閱讀時間10分鐘,認真讀完必有收穫。

UWA 問答社區:answer.uwa4d.com

UWA (僅限技術交流)

渲染

Q:我們的扭曲效果使用了GrabPass,在PC平臺和iOS都正常,但是Android平臺在不開Bloom的情況下會顯示錯誤,本來是一個很透明的面片,變成了透明度比較低的白片,調試整個Shader之後懷疑是顏色空間的問題,切換回Gamma空間後顯示正常。求教下有人遇到過這個問題麼,附Shader代碼。

附註:frag最後強制轉線性空間後接近正常 return pow(tex2D(_GrabTexture, sceneUVs), 2.2);

UWA:根據題主提供的代碼,我們在紅米4X上復現了該問題。的確如題主所預判,跟機型有關,加上pow(color, 2.2)之後看起來似乎正常了。

查閱了相關的官方文檔,看到有類似的Bug反饋,這裡顯示了GLCore修了,估計GLES沒有修。

https://issuetracker.unity3d.com/issues/grabpass-matrial-with-grabpass-shader-renders-much-brighter-on-opengl-in-linear

同時,我們又在Unity 2018版本上用紅米4X做了測試,發現該問題已解決。建議題主可以嘗試用Unity 2018試試。

該回答由UWA提供,歡迎大家轉至社區交流:

https://answer.uwa4d.com/question/5b6bc0f8339d267d357c6d30

OpenGL

Q:關於Unity中Graphics API的選擇,我曾在UWA問答上看過相關的帖子,但還是有幾個相關的疑問:

1)像Android,選擇裡面只有ES2.0和3.0選項,那像上圖那樣把兩者都選了,和勾選Auto有什麼區別呢?是不是都是優先ES3.0,然後不行的話就退到ES2.0?

2)康來有說ES2.0的效果會比3.0的效果差一些,我自己改的Unity PBR Shader也遇到2.0的效果比3.0的效果差的情況,抓幀發現是手機上實際的Shader編譯版本不一樣,想問下同樣的Shader(假設都走同樣的分支,不因為不同宏定義走不一樣的代碼),兩者編譯出來還會有這麼大的表現差異嗎?

3)關於效率上,Graphics API的選擇是只影響GPU方面的效率,不會影響CPU上的效率吧?

A:學渲染的小彩筆過來拋個破磚引塊美玉。

第一個問題,題主的理解是正確的,都是優先ES3.0 然後2.0的。

針對題主的第二個問題:ES3.0引入了新版本的GLSL Shading Language,所以編出來的東西肯定不一樣。

另外ES2.0和ES3.0不僅代表了API的變化,也代表了硬體能力的提升。別的不說,ES3.0完全支持了32位浮點數運算,光是這個就足夠帶來效果上的明顯差異。另外,ES2.0要求Depth Buffer至少16Bits,而ES3.0要求支持24Bits和32Bits。

關於第三個問題,因為API的變換,CPU的效率必然會變化,例如VAO,ES3.0支持而ES2.0不支持。

參考文獻:https://www.khronos.org/registry/OpenGL/specs/es/2.0/es_cm_spec_2.0.pdfhttps://www.khronos.org/registry/OpenGL/specs/es/3.0/es_spec_3.0.pdfhttp://www.openglsuperbible.com/2013/12/09/vertex-array-performance

感謝凱奧斯@UWA問答社區提供回答,歡迎大家轉至社區進一步交流:

https://answer.uwa4d.com/question/5b6e3d581e88b37d34e652a1

資源管理

Q:如何生成被4整除的NPOT圖集?如何選擇一個好的圖集劃分策略?我們紋理壓縮格式選擇的是ETC2(Android) + ASTC(iOS),所以只需要圖片尺寸被4整除就行了。

現在圖集用的是UGUI自帶的SpritePacker,生成的圖集尺寸默認是POT,會導致部分圖集塞不滿,空白區域較多,而美術人工調整圖集歸屬是很麻煩的事,所以希望讓它生成NPOT+被4整除的圖集,這樣圖集歸屬可以隨便弄,空白都不會很多。但看了下自定義圖集打包策略的文檔,似乎沒有相關的接口開放。

TexturePacker也只能提供被2整除的NPOT圖集,所以問問有沒有同學實現過類似的系統,給個思路。

另外,再問幾個問題:

1)項目中存在不同紋理壓縮格式會導致(較大的)性能損失嗎? 比如「全部ETC2"和「儘量優先ETC1,不行再ETC2」這兩種做法。

2)NPOT現代的實現(比如OpenGLES的NPOT擴展),應該不是自動擴展到POT這種方式吧? 如果是這種方式,NPOT的內存佔用就是個坑。

3)NPOT的性能和POT比如何? 能確定的是POT肯定不會比NPOT差,但兩者的性能差距Google有一大堆不同的說法。所以這裡的問題是在現代(移動)GPU上,需要考慮NPOT和POT的性能差距問題嗎?

4)我們之前傾向於照顧美術的習慣,可以的話儘量少約束,所以圖集劃分上希望做到「美術完全不知情不參與」,這樣就會帶來圖集塞不滿的情況。圖集劃分這一塊大家通常是怎麼做的?怎樣在「圖集劃分完美」和「開發\維護成本高昂」之間找一個比較好的平衡?我們主要考慮的還是減少工作成本:別花太多時間在這個上面,然後能保證一個還不錯的效果就行,不需要完美。

A:說一下我們項目的圖集策略,僅供參考:1)只允許方圖;2)保證2的n次冪(解決整除4的問題);3)格式同樓主,但是不同意ETC1和2混用,明顯ETC2壓縮質量好,速度快;4)保證ICON和圖片的名稱確定和規範化,美術不用關心圖集,由策劃來規劃並進行配表,即使圖集有改動,只需要修改配表的圖集名稱即可;5)圖集的規劃分為公共和系統圖集,但是相關的UI界面都會有圖集的引用索引列表,以此來限制美術及策劃的使用範圍;6)做項目是一個三方制約的環境,給太多的自由,勢必會增加工作和溝通成本,對美術設計進行系統規範的設計是必不可少的。

感謝鄭驍@UWA問答社區提供回答

A:我們目前也是ETC(Android) + ASTC(iOS),但是要求還是POT的,只是開放了非方形的貼圖尺寸用於合併的二方連續貼圖。UI部分是要求UI使用TexturePacker合併之後的Atlas提交上來,必須是POT的。

關於題主具體的問題,TexturePacker貌似是有編寫插件的方法?不知道是否可以通過插件限定導出尺寸是4的倍數,來滿足你的需求。

照顧美術的習慣是一個好程序的表現,給題主點讚,但是要注意這部分照顧的成本不要轉嫁到性能或者其他職位的身上,否則不如教一下美術,讓美術按照規則來製作。

感謝賈偉昊@UWA問答社區提供回答

A:關於NPOT,可以參考官方文檔:

https://docs.unity3d.com/Manual/ImportingTextures.html

關於補充的第二點:https://answer.uwa4d.com/question/5b4422bbf91024518ab77aed

另外樓主非要用NPOT的圖集,當然也沒人攔得住你,下面有一個JS寫的Pack算法:https://github.com/jakesgordon/bin-packing

感謝凱奧斯@UWA問答社區提供回答

歡迎大家轉至社區交流:

https://answer.uwa4d.com/question/5b67bea7339d267d357c6cd8

動畫

Q:我使用Mecanim將模型導入到Unity時,提示「** has translation animation that will be discarded「以及」**has sacle animation that will be dscarded」,即某些關節的Scale/Translate動畫被丟棄,但是有一部分動畫卻能正常播放。所以,Mecanim到底是否支持Scale/Translate動畫呢?

UWA:Mecanim的Humanoid模式是不支持Scale/Translate動畫的,如果Scale/Translate動畫是必要的,可以切換到Generic模式。另外,部分關節的Scale/Translate動畫能正常工作,應該是因為這些關節是非Humanoid關聯的(以Generic模式運行的關節)。

該回答由UWA提供,歡迎大家轉至社區交流:

https://answer.uwa4d.com/question/5b71086c1e88b37d34e652b4

邏輯代碼

Q:PropertyInfo的CanWrite = false,如果這個屬性是個List,只能讀不能寫,要怎麼給這個List賦值呢?PropertyInfo.SetValue不行,因為這個屬性不能寫入,現在想通過List的Add方法添加值,不知道怎麼做好,希望大家能給些建議。

A:題主可以嘗試用PropertyInfo.GetValue傳入對象,返回值用as關鍵字轉換成List,接著調用Add。(PropertyInfo.GetValue(obj) as List).Add(xxx)。不過這樣可能會有問題:如果這個List是每次new出來的,那麼依然無法修改對象內部變量。

感謝凱奧斯@UWA問答社區提供回答,歡迎大家轉至社區進一步交流:

https://answer.uwa4d.com/question/5b6a47591e88b37d34e65258

今天的分享就到這裡。當然,生有涯而知無涯。在漫漫的開發周期中,您看到的這些問題也許都只是冰山一角,我們早已在UWA問答網站上準備了更多的技術話題等你一起來探索和分享。歡迎熱愛進步的你加入,也許你的方法恰能解別人的燃眉之急;而他山之「石」,也能攻你之「玉」。

官方技術博客:blog.uwa4d.com官方問答社區:answer.uwa4d.com官方技術(僅限技術交流)

封面圖片來自網絡

UWA GOT (Online) 內測中

構建高質量的管理流水線,讓每一次測試更有意義!

近期精彩回顧基於屏幕空間渲染的液體模擬 【虛幻引擎學習之路】基於Unreal引擎的大地形加載研究【萬象更新】看完性能簡報,想不優化好都難!UWA問答:用心解決「你」的每一個問題!

相關焦點

  • 厚積薄發 光耀全球—建業顯示雷射投影機華南巡展
    普羅米休斯、林橋音響,值此讓我們一同見證了"厚積薄發  光耀全球"的最前沿的雷射技術與產品。      在互動交流環節中,現場嘉賓都積極踴躍地參與,對雷射投影機產品、融合方案變現出濃厚的興趣,結合客戶的項目情況提出了應用方面的問題
  • 光電理論技術:光學信息處理中的「線性處理」
    光學信息處理按處理的性質可分為線性處理和非線性處理兩大類。在線性處理中又分為空間不變和空間可變兩類。  所謂線性處理是指系統對多個輸入之和的響應(輸出)等於各單獨輸入時的響應(輸出)之和。一個光學成像系統就是典型的線性系統。相干光照明時,光學透鏡所具有的傅立葉變換是一種線性變換。
  • 如何處理博物館照明的亮與暗?
    跑過大大小小數百家博物館,發現一個普遍的問題: 大型綜合類博物館一般來說會比較暗,像個」黑盒子」。而小型或非國有博物館都比較亮。兩者反差較大。 博物館整體空間比較暗,這個好理解:空間做暗能讓人們安靜下來,這樣能夠集中注意力,專注觀展。
  • MATLAB中的圖像變換之線性空間濾波
    凡是使用空間模板進行的圖像處理,我們就定義為空間濾波,模板本身被稱為空間濾波器。圖像的空域線性濾波和非線性濾波在空域對圖像進行濾波處理無非兩種情況:線性濾波和非線性濾波。濾波的意思就是對原圖像的每個像素周圍一定範圍內的像素進行運算,運算的範圍就稱為掩膜或領域。
  • [PRML]線性回歸模型--線性基函數模型
    這通常稱為線性回歸(linear regression)。『tanh』函數的線性組合。每個基函數表示一個特定的頻率並且有無限的空間延伸。對比發現,基函數是在由不同空間頻率光譜組成的輸入空間的有限區域內局部化。在許多信號處理中,感興趣的是在空間和頻率上局部化的基函數,即小波(wavelets)。它們也被定義為相互正交,以簡化它們的應用。小波最適用於輸入值位於規則晶格上的情況,例如時間序列中連續的時間點,或圖像中的像素。
  • 離經叛道還是厚積薄發,杜伽Fusion三模機械鍵盤開箱
    鍵盤外殼由上下兩部分組成,前側的額頭部分也是這把鍵盤的一個特色,鍵盤的四個角都做了圓弧倒角處理。鍵帽字符是美觀的閉口字符,位置靠前居中。三種模組之間的切換都印製在了鍵帽的側面,共提供了兩組藍牙5.0通道、一組2.4G無線通道,以及一組有線模式,也就意味著Fusion最多可以連接四臺設備,並且可以在多臺設備之間迅速切換。
  • 圖像處理中的數學原理詳解11——線性空間
    2.3 泛函與抽象空間本文引用地址:http://www.eepw.com.cn/article/201704/346200.htm  牛頓說:「把簡單的問題看得複雜,可以發現新領域;把複雜的問題看得簡單,可以發現新規律。」
  • 線性回歸的幾何與概率視角
    Content線性回歸-幾何視角線性回歸-概率視角Pseudo-inverse偽逆的介紹局部加權線性回歸多個output的線性回歸情況線性回歸的幾何角度這也和現實裡面的情況相符,比方說我們認為某個時刻的股價受周圍幾天的股價影響較大,而更遠的股價對這個時刻的股價影響較小。借用一個知乎上給出一個例子,我們可以看到局部加權回歸相較於OLS線性回歸的強大之處。這是我們要擬合的一個data,顯然如果使用OLS會是一個欠擬合的結果。
  • Metal圖像處理——直方圖均衡化
    (光柵化是頂點處理之後的步驟,業務層無法修改)texture2d<float> colorTexture [[ texture(LYFragmentTextureIndexSource) ]], // texture表明是紋理數據,LYFragmentTextureIndexSource是索引device LYLocalBuffer &convertBuffer
  • 空間?向量?——向量及其線性運算
    小編在上一篇文章中已經說過,接下來就開始向量代數與空間解析幾何的內容了。可能有些大學上學期學到微分方程前就不學了,可能是學到向量代數與空間解析幾何不學了的。所以上學期學過微分方程的同學,現在也可以和小編從現在開始複習。
  • CFA二級:線性回歸假設的違反,識別與處理「量化方法分析」
    CFA二級量化方法重點分析:線性回歸假設的違反,識別與處理   高頓財經CFA講師  Quine老師   線性回歸分析的有效性依賴於若干假設,這些假設包括:
  • 薄薄的液晶顯示器是如何顯示各種圖案?帶你了解液晶顯示原理
    當今社會,每個人都離不開各種電子設備,特別是手機和電腦,設備中各種視頻、圖案和文字等都是通過電子屏幕顯示出來,這些電子產品的顯示器材都是液晶。液晶是什麼物質?它是如何顯示數字或圖像呢?那麼下面我們就來詳細了解屏幕的內部結構,了解其中的原理。
  • 實用英語:Grab a bite 隨便吃點
    在這種情況下,你一定會臨時找點什麼東西先填補一下,這在英文裡就叫做:to grab a bite。   To grab a bite要翻成口語就是「先吃點什麼」,因此和正式吃一頓飯有很大不同。下面這個說話的人是剛下班回家,正在對他太太說他為什麼這麼餓:   Honey, I'm so hungry I could eat a horse!
  • 問題引導的代數學: 線性函數與雙線性函數 I
    餘下各章我們將討論線性空間上的函數. 從線性變換到線性函數的轉換看起來有點突兀, 實際上我們會發現這些內容有很強的相互聯繫, 它們都統一在矩陣的框架之下, 並且為矩陣論的發展提供了更多有效的工具. 我們的研究方法也是一貫的——通過在一組基下的矩陣來研究遇到的各種數學對象.
  • 用過線性電位計作為音量控制器,要如何調整?
    你曾用過線性電位計作為音量控制器嗎?如果你使用過,你可能會發現,音量跳變得非常快。如果想將音量調整得相當小,你可能需要safe-cracker般的靈敏觸覺(safe-cracker能夠靠自己靈敏的聽覺來破譯保險箱的密碼,作者此處是一種比喻,對於線性電位計,常人是很難將音量調得相當小的)。這時就需要對數電位計。
  • 液晶亮/壞點產生是如何產生的及預防
    顯然,這種生產工藝對生產線要求是非常高的,以目前的技術和工藝,還不能保證每批生產出來的液晶屏沒有亮/壞點,生產廠商一般避開亮/壞點來分割液晶板,把沒有亮/壞點或者極少亮/壞點的液晶屏高價供給有實力的生產廠商,而那些亮/壞點比較多的液晶屏則一般低價供給小廠商生產廉價的液晶顯示器。  從技術上講,亮/壞點是液晶顯示板上不可修復的像素,是在生產過程中產生的。
  • 零基礎的同學如何用stata做多元線性回歸模型?
    上一期,我們分享了如何用stata做一元線性回歸模型,不知道同學們學的怎麼樣呢?有沒有自己動手操作一遍呢?這一期:我們將學習如何用stata做多元線性回歸模型!這些是小王(邀請者)最近學習計量時的一些心得和體會,希望能與大家一起分享。
  • 線性回歸分析思路總結!簡單易懂又全面!
    線性回歸是一種研究影響關係的方法,在實際研究裡非常常見。本文就來梳理下線性回歸分析的分析流程,閒話少說,我們開始吧!線性回歸回歸分析實質上就是研究一個或多個自變量X對一個因變量Y(定量數據)的影響關係情況。
  • 這些閃爍的小燈亮起來了!你知道怎麼處理嗎?
    出現汽車故障指示燈的時候如何處理。相信絕大部分的車主在開車的時候,或多或少都會碰著過汽車經常見到的幾個小毛病,都碰到到過汽車指示燈亮了,開車的時候總能給車主添點麻煩,讓人無語的很。驚慌失措的不知該怎樣處理,其實出現汽車故障指示燈,是提醒該車輛可能存在一定故障需馬上解決。
  • Python環境下的8種簡單線性回歸算法
    選自Medium作者:Tirthajyoti Sarkar機器之心編譯參與:晏奇、劉曉坤本文中,作者討論了 8 種在 Python 環境下進行簡單線性回歸計算的算法,不過沒有討論其性能的好壞,而是對比了其相對計算複雜度的度量。