1 回答

TA貢獻1824條經驗 獲得超6個贊
如果您可以對照片數組進行索引,以便有效地獲得地球的等距柱狀投影,則可以嘗試使用著色器代碼的修改形式Farfarer Unity論壇復制并稍作修改如下:
Shader "Custom/Equirectangular" {
? ? Properties{
? ? ? ? _MainTexArray("Tex", 2DArray) = "" {}
? ? ? ? _COLUMNS("Columns", Int) = 2
? ? ? ? _ROWS("Rows", Int) = 2
? ? }
? ? ? ? SubShader{
? ? ? ? ? ? Pass {
? ? ? ? ? ? ? ? Tags {"LightMode" = "Always"}
? ? ? ? ? ? ? ? CGPROGRAM
? ? ? ? ? ? ? ? ? ? #pragma vertex vert
? ? ? ? ? ? ? ? ? ? #pragma fragment frag
? ? ? ? ? ? ? ? ? ? #pragma require 2darray
? ? ? ? ? ? ? ? ? ? #include "UnityCG.cginc"
? ? ? ? ? ? ? ? ? ? struct appdata {
? ? ? ? ? ? ? ? ? ? ? ?float4 vertex : POSITION;
? ? ? ? ? ? ? ? ? ? ? ?float3 normal : NORMAL;
? ? ? ? ? ? ? ? ? ? };
? ? ? ? ? ? ? ? ? ? struct v2f
? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? float4? ? pos : SV_POSITION;
? ? ? ? ? ? ? ? ? ? ? ? float3? ? normal : TEXCOORD0;
? ? ? ? ? ? ? ? ? ? };
? ? ? ? ? ? ? ? ? ? v2f vert(appdata v)
? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? v2f o;
? ? ? ? ? ? ? ? ? ? ? ? o.pos = UnityObjectToClipPos(v.vertex);
? ? ? ? ? ? ? ? ? ? ? ? o.normal = v.normal;
? ? ? ? ? ? ? ? ? ? ? ? return o;
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? UNITY_DECLARE_TEX2DARRAY(_MainTexArray);
? ? ? ? ? ? ? ? ? ? int _ROWS;
? ? ? ? ? ? ? ? ? ? int _COLUMNS;
? ? ? ? ? ? ? ? ? ? #define PI 3.141592653589793
? ? ? ? ? ? ? ? ? ? inline float2 RadialCoords(float3 a_coords)
? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? float3 a_coords_n = normalize(a_coords);
? ? ? ? ? ? ? ? ? ? ? ? float lon = atan2(a_coords_n.z, a_coords_n.x);
? ? ? ? ? ? ? ? ? ? ? ? float lat = acos(a_coords_n.y);
? ? ? ? ? ? ? ? ? ? ? ? float2 sphereCoords = float2(lon, lat) * (1.0 / PI);
? ? ? ? ? ? ? ? ? ? ? ? return float2(sphereCoords.x * 0.5 + 0.5, 1 - sphereCoords.y);
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? float4 frag(v2f IN) : COLOR
? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? float2 equiUV = RadialCoords(IN.normal);
? ? ? ? ? ? ? ? ? ? ? ? float2 texIndex;
? ? ? ? ? ? ? ? ? ? ? ? float2 uvInTex = modf(equiUV * float2(_COLUMNS,_ROWS), texIndex);
? ? ? ? ? ? ? ? ? ? ? ? int flatTexIndex = texIndex.x * _ROWS + texIndex.y;
? ? ? ? ? ? ? ? ? ? ? ? return UNITY_SAMPLE_TEX2DARRAY(_MainTexArray,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? float3(uvInTex, flatTexIndex));
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ENDCG
? ? ? ? ? ? }
? ? ? ? }
? ? FallBack "VertexLit"
}
您還需要使用
texArr = new Texture2DArray(256, 256, textures.Length, TextureFormat.RGBA32, false, true);
代替
texArr = new Texture2DArray(256, 256, textures.Length, TextureFormat.RGBA32, true, false);?
如果我將此腳本附加到球體上,它對我有用:
Material myMat;
public List<Texture2D> texes;
IEnumerator Start()
{
? ? yield return null;
? ? myMat = GetComponent<Renderer>().material;
? ? Texture2DArray texArr = new Texture2DArray(256, 256, 9,?
? ? ? ? ? ? TextureFormat.RGBA32, false, true);
? ? texArr.filterMode = FilterMode.Bilinear;
? ? texArr.wrapMode = TextureWrapMode.Clamp;
? ? for (int i = 0 ; i < texes.Count ; i++)
? ? {
? ? ? ? texArr.SetPixels(texes[i].GetPixels(), i, 0);
? ? }
? ? texArr.Apply();
? ? myMat.SetTexture("_MainTexArray", texArr);
}
并在texes中按順序添加這些紋理:
并將行和列設置為 3,它會產生不錯的結果:
如果啟用雙線性過濾,紋理邊界處仍然存在一些偽影。但這些文物必須放大得很近才能看到。由于雙線性過濾缺乏相鄰像素,它們大多顯示為混合不當或丟失像素:
當然,這個示例沒有正確平鋪,因此沿著一條經線有明顯的接縫:
由于此設置需要來自球體的法線,因此這只適用于法線接近球體的物體。因此,例如,它無法在平面上正確渲染。
- 1 回答
- 0 關注
- 191 瀏覽
添加回答
舉報