在Unity中制作Fisheye Skybox着色器

问题描述 投票:0回答:1

Unity具有内置的Skybox着色器,它可以像这样使用立方体贴图纹理或等矩形纹理

“”

将其加载到the instructions并跟随其用作天空盒的工作原理

skybox from equirectangular image in unity

我想扩展它以处理像这样的鱼眼图像

“

着色器的代码可从built in shaders获得,并且beta版(乍一看似乎是相同的)here

通过着色器代码查看,在顶点着色器中计算了3D方向,并将其传递给片段着色器。然后,片段着色器应采用该3D方向并生成纹理坐标。

这里是等角图像的代码

inline float2 ToRadialCoords(float3 coords)
{
  float3 normalizedCoords = normalize(coords);
  float latitude = acos(normalizedCoords.y);
  float longitude = atan2(normalizedCoords.z, normalizedCoords.x);
  float2 sphereCoords = float2(longitude, latitude) * float2(0.5/UNITY_PI, 1.0/UNITY_PI);
  return float2(0.5,1.0) - sphereCoords;
}

这是我尝试将其更改为鱼眼图像的代码

inline float2 ToFisheyeCoords(float3 coords)
  float3 normalizedCoords = normalize(coords);

  float r = 2.0 * atan2(length(normalizedCoords.xy), abs(normalizedCoords.z)) / UNITY_PI;
  float theta = atan2(normalizedCoords.y, normalizedCoords.x * sign(normalizedCoords.z));
  float2 uv = float2(cos(theta), sin(theta)) * r * 0.5 + 0.5;
  return frac(uv * float2(-1, 1));
}

但是它不起作用。

enter image description here

我觉得我正在忽略一些明显的问题。

整个项目为here。要在鱼眼镜头示例和等角矩形示例之间切换,您需要打开“窗口”->“渲染”->“灯光设置”,然后将“ SkyboxMaterialEquire”矩形拖动到“照明”窗口的“ Skybox材质”插槽中。

unity3d shader fragment-shader
1个回答
0
投票
再多花些时间,这似乎可行

inline float2 ToFisheyeCoords(float3 coords) { float3 normalizedCoords = normalize(coords); float r = 2.0 * atan2(length(normalizedCoords.xy), abs(normalizedCoords.z)) / UNITY_PI; float theta = atan2(normalizedCoords.y, normalizedCoords.x); float2 uv = float2(cos(theta), sin(theta)) * r * 0.5 + 0.5; return float2(uv.x * 0.5, uv.y); }

© www.soinside.com 2019 - 2024. All rights reserved.