Unity имеет встроенный шейдер Skybox, который принимает либо текстуру куба, либо экватериальную angular текстуру, подобную этой
Загрузка и следование инструкциям чтобы использовать его в качестве скайбокса
Я хочу расширить его для обработки изображения типа "рыбий глаз", подобного этому
Код для шейдера доступен из встроенных шейдеров , и доступна бета-версия (которая на первый взгляд выглядит одинаково) здесь
При просмотре кода шейдера трехмерное направление вычисляется в вершинном шейдере и передается фрагментному шейдеру. Затем предполагается, что фрагментный шейдер принимает это трехмерное направление и генерирует текстурную координату.
Вот код для равных angular images
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));
}
Но это не работает.
Мне кажется, что я упускаю что-то очевидное.
Весь проект здесь . Чтобы переключиться между примером «рыбий глаз» и примером equirect angular, вам нужно открыть Window-> Rendering-> Light Settings, а затем перетащить SkyboxMaterialEquirect angular в слот Skybox Material в окне Lighting.