【发布时间】:2020-03-24 09:29:48
【问题描述】:
Unity 有一个内置的 Skybox 着色器,它可以采用立方体贴图纹理或像这样的 equirectangular 纹理
加载它并关注the instructions 以将其用作天空盒作品
我想扩展它来处理这样的鱼眼图像
着色器的代码可从built in shaders 获得,测试版(乍一看似乎相同)可从here 获得
查看着色器代码,在顶点着色器中计算 3D 方向并传递给片段着色器。然后片段着色器应该采用该 3D 方向并生成纹理坐标。
这是 equirectangular 图像的代码
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));
}
但它不起作用。
我觉得我忽略了一些明显的东西。
整个项目是here。要在鱼眼示例和 equirectangular 示例之间切换,您需要打开 Window->Rendering->Light Settings,然后将 SkyboxMaterialEquirectangular 拖到 Lighting 窗口中的 Skybox Material 插槽中。
【问题讨论】:
标签: unity3d shader fragment-shader