我正在使用著色器(下面的代碼),它允許我將影像顏色轉換為灰度(如果需要,還帶有透明度)。
一切都很完美,直到我將我的設備更新到 iOS 15。自從那次更新后,我的著色器在場景渲染后就會出現故障。經過很多天尋找解決方案,我注意到這與 iPhone 暗模式有關。
我在這里提供了一些“概念”示例,以向您展示當前發生的情況:

灰度著色器應用于紅色立方體。
- 立方體A在 iPhone 上運行并激活了暗模式(這是我在 Unity 中得到的結果,正確的結果)。
- 立方體B表示禁用暗模式的同一物件。
問題是我一直在將這些著色器用于我的應用程式中的很多專案,根據用戶的暗模式首選項,這給我帶來了不一致和丑陋的 UI。
注意:我認為問題不在于著色器本身,因為在 < iOS 15 版本上它作業正常。我認為是關于 iOS 15 如何處理具有透明效果的著色器,但這只是一個假設,因為我仍然不知道如何使用著色器(我是一名學生)。
這是我正在使用的著色器:
Shader "Unlit/NewUnlitShader"
{
Properties
{
_MainTex ("Base (RGB) Trans (A)", 2D) = "white" {}
_EffectAmount ("Effect Amount", Range (0, 1)) = 1.0
}
SubShader
{
Tags
{
"Queue"="Transparent"
"IgnoreProjector"="True"
"RenderType"="Transparent"
}
LOD 200
Blend SrcAlpha OneMinusSrcAlpha
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct appdata_t
{
float4 vertex : POSITION;
float2 texcoord : TEXCOORD0;
};
struct v2f
{
float4 vertex : SV_POSITION;
half2 texcoord : TEXCOORD0;
};
sampler2D _MainTex;
float4 _MainTex_ST;
uniform float _EffectAmount;
v2f vert (appdata_t v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.texcoord = TRANSFORM_TEX(v.texcoord, _MainTex);
return o;
}
fixed4 frag (v2f i) : SV_Target
{
fixed4 c = tex2D(_MainTex, i.texcoord);
c.rgb = lerp(c.rgb, dot(c.rgb, float3(0.3, 0.59, 0.11)), _EffectAmount);
return c;
}
ENDCG
}
}
Fallback "Standard"
}
這是一個錯誤還是我錯過了什么?
更新 - 解決
這是一個錯誤,Unity 開發人員已收到通知。
uj5u.com熱心網友回復:
“著色器作業 < iOS 15”并不意味著著色器本身總是正確的。
一些簡單的著色器變數型別,如 float、half 和 fixed,可以在不同的設備和作業系統中為您提供完全不同的結果。
“half”和“fixed”變數以獲得更好的性能,而“float”則減少錯誤。
由于不同的 CPU/GPU 規格以及您的圖形 API 選項,它主要發生在移動設備上。
另一個關鍵詞是“色彩空間”,請在您的 Unity Build Player 設定中檢查 Linear & Gamma 選項。
損壞的著色器將回傳粉紅色。如果它不是粉紅色,那一定是你的著色器中的一些數學問題導致了錯誤的結果。 著色器代碼非常直接。如果一段時間后渲染結果發生變化,則某些變數似乎在運行時也發生了變化。很明顯,您正在使用的插件還包含 C# 和 Shader 之間的大量數學計算。
您可以想象一下: 當 C# 代碼試圖從 Shader 獲取變數時,但著色器為您在 C# 中的計算回傳了錯誤的變數。然后,C#再次將錯誤的計算結果分配給Shader。這將成為錯誤結果的無限回圈。
Unity UI 效果(帶著色器)不可靠: 有時,它們只是沒有更新……您必須通過腳本強制它們更新。下面的命令有時可能會有所幫助,但并非總是如此......
Canvas.ForceUpdateCanvases();
ScrollRect.GraphicUpdateComplete();
因此,您應該聯系維護此插件的開發人員。因為他們最了解他們的插件是如何作業的
否則,您應該開始撰寫自己的著色器腳本。灰度著色器非常容易撰寫..
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/375000.html
上一篇:助理編輯器只打開viewController而不是另一個類
下一篇:使用工具列在視圖控制器之間移動
