Я пытаюсь создать 2D-эффект «поддельной планеты» с использованием шейдеров, но результат, который у меня есть, пока он работает, невелик.Unity 2D Planet/Curved World Shader
void vert(inout appdata_full v)
{
//Get vertex world coordinates
float4 worldV = mul(unity_ObjectToWorld, v.vertex);
//Get target coordinates relative to vertex world
worldV.xyz -= _TargetPos.xyz;
//Transform vertex based on x distance from target
worldV = float4(0.0f, (worldV.x * worldV.x) * -_Curvature, 0.0f, 0.0f);
//Add this offset to vertex
v.vertex += mul(unity_WorldToObject, worldV);
}
Код выше вершинная функция, которую я использую, чтобы произвести этот эффект, но так как она компенсирует только вершины на Y на основе X игрока, он производит искажение вблизи края экрана. Это просто выглядит, так как все вертикальные линии остаются полностью вертикальными.
Что я хотел бы, чтобы это сделать, это сделать его более, как планета:
Но я не знаю, как я бы об этом.
EDIT: Я пытался в течение нескольких часов, чтобы понять это, и я думал, что я понял это:
.
Но нет, это не сработало. Уровень просто казался кривой и окунуться в случайные места.
Спасибо за ваш ответ, но я не уверен, полностью ли вы прочитали мой вопрос. Код, который вы мне показали, это то, что я отправил, как уже пробовал, только с дополнительной осью z и некоторым смещением. Не думаю, что это важно, так как это работает достаточно хорошо, когда то, что я пытаюсь сделать, кажется почти невозможным. – Jack
Извините, моя вина. Попытайтесь выяснить зависимость между изменением нормалей от плоского мира до изогнутого, а затем поверните по отношению к центру «планеты» – Krajca