Unity Cg 着色器:着色器错误:在第 87 行解析时内存不足(在金属上)


'

Unlit/SphericalMap'中的着色器错误:在第87行解析时内存不足(在金属上(

大家好,我在Unity Cg着色器中遇到错误,我想寻求帮助... 我在下面有这个功能

float GetLatLongDist(float lat1, float long1, float lat2, float long2){
float R = 6371;
float dLat  = deg2rad(lat2-lat1);
float dLon  = deg2rad(long2-long1);
float a =   sin(dLat/2) * sin(dLat/2) + 
cos(deg2rad(lat1)) * cos(deg2rad(lat2)) *
sin(dLon/2) * sin(dLon/2);
float c = 2 * atan2(sqrt(a),sqrt(1-a))
float d = R * c;
return d;
}

由于某种原因,它会导致错误说

Shader error in 'Unlit/SphericalMap': out of memory while parsing at line 87 (on metal)
Compiling Vertex program
Platform defines: UNITY_ENABLE_REFLECTION_BUFFERS UNITY_USE_DITHER_MASK_FOR_ALPHABLENDED_SHADOWS UNITY_PBS_USE_BRDF1 UNITY_SPECCUBE_BOX_PROJECTION UNITY_SPECCUBE_BLENDING UNITY_ENABLE_DETAIL_NORMALMAP SHADER_API_DESKTOP UNITY_COLORSPACE_GAMMA UNITY_LIGHT_PROBE_PROXY_VOLUME UNITY_LIGHTMAP_FULL_HDR

我对着色器编程很陌生,我无法弄清楚这段代码有什么问题。 有人可以帮我解决这个问题吗?提前谢谢。

整个着色器

// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'

Shader "Unlit/SphericalMap"
{
Properties
{
_MainTex("Texture", 2D) = "white" {}
_Depth("Depth", Float) = 0
_Lat("Latitude", Range(-90,90)) = 0
_Long("Londitude", Range(-180,180)) = 0
_Rad("Radius", Range(0.1,1)) = 1
}
SubShader
{
Tags { "RenderType" = "Transparent" "Queue"="Transparent" }
LOD 100
Cull Front

Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
// make fog work
#pragma multi_compile_fog
#include "UnityCG.cginc"
//Vertex Input
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
float3 normal : NORMAL;
};
//Vertex Output
struct v2f
{
float2 uv : TEXCOORD0;
UNITY_FOG_COORDS(1)
float4 vertex : SV_POSITION;
float3 normal : TEXCOORD1;
};
sampler2D _MainTex;
float4 _MainTex_ST;
float _Lat;
float _Long;
float _Rad;
v2f vert(appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = TRANSFORM_TEX(v.uv, _MainTex);
o.normal = v.normal;
UNITY_TRANSFER_FOG(o,o.vertex);
return o;
}
#define PI 3.141592653589793
float deg2rad(float val){
return val * PI / 180;
}
inline float2 RadialCoords(float3 a_coords)
{
float3 a_coords_n = normalize(a_coords);

//Converting IN.normal to lat lon coordinate
float lon = atan2(a_coords_n.z, a_coords_n.x);
float lat = acos(a_coords_n.y);
//Lat long to equirect UV
float2 sphereCoords = float2(lon, lat) * (1.0 / PI);
return float2(sphereCoords.x * 0.5 + 0.5, 1 - sphereCoords.y);
}
float GetLatLongDist(float lat1, float long1, float lat2, float long2){
float R = 6371;
float dLat  = deg2rad(lat2-lat1);
float dLon  = deg2rad(long2-long1);
float a =   sin(dLat/2) * sin(dLat/2) + 
cos(deg2rad(lat1)) * cos(deg2rad(lat2)) *
sin(dLon/2) * sin(dLon/2);
float c = 2 * atan2(sqrt(a),sqrt(1-a))
float d = R * c;
return d;
}

inline float2 GetLatLong(float3 a_coords)
{
float3 a_coords_n = normalize(a_coords);

//Converting IN.normal to lat lon coordinate
float lon = atan2(a_coords_n.z, a_coords_n.x);
float lat = acos(a_coords_n.y);
return float2(lat,lon);
}

float4 frag(v2f IN, out float depth : DEPTH) : COLOR
{
float2 equiUV = RadialCoords(IN.normal);
float2 latLong = GetLatLong(IN.normal);
depth = 0;
equiUV.x = 1 - equiUV.x;
float4 col = tex2Dlod(_MainTex, float4(equiUV.x,equiUV.y,0,0));
col.r += GetLatLongDist(latLong.x,latLong.y, _Lat,_Long);
return col;
}
ENDCG
}
}
}

我想出了导致此问题的原因,但我仍然不确定为什么。

看起来当我使用带有long1名称的参数时,它开始导致此问题,尽管lat1很好......long也很好。我不知道为什么。如果有人知道真正的原因,请教我。

谢谢大家!

最新更新