前一段時間去英國出差,發現Unity Brighton 辦公室的手繪地圖牆很漂亮,在這裏分享給你們。
html
在這篇文章中,咱們選擇了過去幾周Unity官方社區交流羣以及UUG社區羣中比較有表明性的幾個問題,總結在這裏和你們進行分享。主要涵蓋了UGUI、Lighting、Profiler、Shader Graph、SRP、Compute Shader、GLES等領域。windows
同時,也歡迎你們加入咱們這個討論乾貨的官方技術羣,交流見解分享經驗。
Unity官方社區交流羣:629212643數組
Q:陳老師。我發現個問題。Unity 2018.2.3之後的幾乎全部版本的inputfield沒辦法輸入部分中文字符,好比「我」,我今天試了好多好多版本。2017是肯定沒有這個問題的。可是2018我從高到低裝了好多。2018.1.9不存在這個問題。app
A:Hi,這是一個已知的2018.2的Bug。Bug的緣由是因爲2018.2中將16bit的C# char截成了8bit的C++ char。咱們在2018.3中修復了該問題,而且會Backport回2018.2的版本。ide
Q:有一個UGUI作的prefab,每次apply以後第一個slider老是會錯位,有遇到的嗎?Unity版本2017.3.0f3。
A:嗯,這是一個已知Bug。而且該Bug已經在2017.3.1p1版本中修復了。推薦你直接升級使用咱們的長期維護版本2017.4,該版本會持續修復發現的Bug。性能
Q1: 最近場景要作烘焙陰影動態加載,嘗試了下mixed燈光下烘焙出來的shadowmask貼圖添加到lightmapping中沒辦法正常顯示出來。看結構已經和取數值出來的時候是如出一轍了。網上看到有人說,shadowmask須要保留光源在場景中,不然會顯示失敗。想了解是否是真的須要保留燈光。或者有其餘作法能夠動態加載shadowmask。ui
A: shadowmask是mixed光照模式的一種,而且它保存的是mask信息,即mask信息,而不是真實的光照產生的陰影效果。在mixed-shadowmask光照模式下,須要light來提供直接光,再利用陰影mask來生產陰影。
若是想要關閉光照,能夠考慮使用mixed-subtractive模式或者bake模式。將直接光照結果預先烘焙到貼圖上。插件
Q2:我有兩個場景。第一個場景烘焙ok,第二個場景複製的第一個場景,而後加了點新的傢俱,再烘焙就都是黑的。並且場景內對象的light probes選項也不能勾選。LightMap沒有丟失,就是烘焙出來都是黑的。3d
A:不能勾選light probe是由於你的物體設置了Lightmap static的flag,因此它的lighting信息會烘焙到Lightmap上,而不是從Light Probe中獲取。
固然,若是是針對LOD Group的烘焙,在勾選了Lightmap static後,仍是能夠在模型上勾選light probe的,這是由於LOD須要light probe來提供間接光。
烘焙後模型變黑的問題,首先要確認是否爲模型設置了UV2數據。這是由於烘焙時須要UV2數據。其次,能夠檢查一下模型的Shader中是否包含Meta Pass。
能夠參考:
https://docs.unity3d.com/Manual/MetaPass.html
同時,還須要檢查一下場景中的Light是否開啓,並正確的設定了屬性。以及Lighting Window中的間接光Indirect Intensity不爲0。code
Q3:場景進行光照烘焙時存在速度較慢的問題,是否有一些設置上的改進或最佳實踐?
A:在lighting設置窗口中,主要是因爲Indirect Resolution的設置會影響烘焙的速度。
事實上,利用Lightmap Parameter機制能夠對場景中不一樣的區域設置不一樣的烘焙參數,例如光照變化較爲低頻的部分能夠建立一個分辨率較低的Lightmap Parameter,以節約烘焙時間。
Q:請問一下性能指標裏面的SetPassCalls和Draw Calls、Batches這些有什區別,具體指什麼呢?網上有人說是同樣的東西,可是我發現有時候值不同。
A:SetPass Call指的是切換渲染狀態(render state)的次數,好比你的shader中若是有多個pass,或者是場景中有不一樣的material,都會形成渲染狀態切換。
Drawcall的話,以gles爲例,就是調用draw的實際次數,例如drawarray、drawelement,調用一次都會增長。
Batch則是會在第一次調用draw行爲的時候加1,若是以後渲染狀態沒有改變,則batch的數量再也不增長,可是一次batch內可能會有屢次drawcall調用,只是渲染狀態沒有改變。
Q:有朋友在用Shader Graph嗎?請問它能夠將節點轉成shader供Unity 2017使用嗎?
A:右鍵點擊節點有一個copy code的選項,能夠複製代碼。針對根結點,則能夠copy生成的所有代碼。
可是不建議在Unity 2017中使用,由於Shader Graph主要是和SRP配合使用的,SRP Shader library和UnityCG.cginc中有比較多的區別。
Q:在Unity2018中,使用Lightweight Render Pipeline的時候,有一些Asset Store上的插件的顯示結果不正確。
A: 傳統渲染流水線的Built-in的Shader以及自定義的光照 Shader目前不能在新的Lightweight Render Pipeline中使用。LWRP有其本身的Shader。
若是是傳統的Built-in Shader,則能夠經過菜單選擇直接升級到LWRP的Shader。
可是本身寫的lit shader會比較麻煩,目前須要手動來修改。這是由於SRP Shader library和UnityCG.cginc中有比較多的區別。所以這個問題只能向插件做者反饋了,或者你仍然使用傳統的渲染流水線。
Q:話說Unity的Compute Shader傳float數組一直有bug。好比傳float[5],C#裏寫ComputeShader.SetFloats是沒法成功的,只有第一個float能夠設置成功,這個bug官方已知嗎?
A: 這個不是bug。而是根據HLSL的規則,應該對數據進行對齊,以免爲計算偏移所致使的ALU開銷。
HLSL的相關文檔能夠參考:
https://docs.microsoft.com/zh-cn/windows/desktop/direct3dhlsl/dx-graphics-hlsl-packing-rules
"Arrays are not packed in HLSL by default. To avoid forcing the shader to take on ALU overhead for offset computations, every element in an array is stored in a four-component vector."
所以調用帶有float []參數的SetFloats應根據HLSL規則進行對齊,即float []應按每一個數據16字節,也就是float4的形式傳遞。
例如以下格式:
//Setup Float Array _floatArray = new float[4*4]; _floatArray[0] = 0.25f; _floatArray[4] = 0.50f; _floatArray[8] = 0.75f; _floatArray[12] = 1.00f;
傳遞的結果就是,(0.25, 0.5, 0.75,1)。
而Unity的文檔中,其實也有提到這個問題。具體內容能夠查看文檔。
https://docs.unity3d.com/ScriptReference/ComputeShader.SetFloats.html
This function can be used to set float vector, float array or float vector array values. For example, float4 myArray[4] in the compute shader can be filled by passing 16 floats.
Q:咱們如今須要一個非壓縮單通道格式的紋理,做爲palatte使用。用Alpha8在某些mali gpu手機上有問題,會變成rgba32位格式,內存增長4倍。請問是爲何?另外R8的這個在哪裏能夠設置?
A:第一個問題,在某些mali gpu手機上有問題,這是因爲Alpha8 texture format在OpenGL ES 3 及以上版本中被移除了,所以咱們使用了GL_EXT_texture_swizzle拓展來實現相似的功能,可是GL_EXT_texture_swizzle拓展在某些mali gpu的手機上的實現存在問題,致使該功能不能正常工做。
若是要使用R8格式,能夠將Texture Type設置爲Single Channel,選擇Red便可。
好了,以上就是想和你們分享的幾個在羣裏討論的小問題。
再次,歡迎你們加入咱們這個討論乾貨的官方技術羣,交流分享呀。
Unity官方社區交流羣:629212643