Последние несколько дней я работал над программированием эффекта, который я видел в игре под названием Катакомбы Соляриса .Чтобы проверить эффект, я создал эту демонстрацию:
- Это изображение накладывается на экран: (масштабируется в соответствии с разрешением) Наложение изображения радуги .
- При нажатии пробела экранные координаты вершин игровой сетки преобразуются в UV и применяются к сетке с той же текстурой.
Когдакамера обращена к четырехугольнику под перпендикулярным углом, эффект выглядит следующим образом: пример перпендикулярной камеры .
По-другому объяснить, если верхняя левая координата четырехугольника равна 30%через экран по горизонтали и 40% по экрану по вертикали, я надеюсь, что при создании UV для вершины (0,3, 0,4) текстура будет идеально соответствовать наложению (как видно на рисунке).
Теперь, эффект работает только в том случае, если камера может смотреть и под другими углами, поэтому вот изображение камеры при небольшом повороте (вокруг оси Y) после обновления текстуры: Пример не перпендикулярной камеры .
Как вы можете видеть, текстура почти выравнивается, но немного искажена, особенно вокруг треугольных границ сетки, как показано здесь вite: Треугольники сетки .
Вот код, который я использую для обновления текстуры
void UpdateTexture() {
// test is the rainbow Texture2D
// r is the Renderer
r.material.mainTexture = test;
// m is the Quad mesh
Vector3[] vert = m.vertices;
Vector2[] uv = m.uv;
// We will go through each vertex of the mesh
for(int i = 0; i < uv.Length; i++) {
// Find where the world position of that vertex is
Vector3 worldPosition = transform.TransformPoint(vert[i]);
// Convert that into a screen position based on our camera
Vector2 screenPosition = CameraToTexture.cam.WorldToScreenPoint(worldPosition);
// Put that within the range 0...1 as a UV
Vector2 uvPosition = new Vector2(screenPosition.x / CameraToTexture.cam.pixelWidth, screenPosition.y / CameraToTexture.cam.pixelHeight);
// Save that UV into our temp array
uv[i] = uvPosition;
}
// Apply to the UV array of the mesh
m.uv = uv;
}
Мои вопросы:
- Почему текстура искривлена по границам треугольника?
- Почему эффект работает по-разному, когда камера не под прямым углом?
- Как это исправить?/ Что я могу посмотреть, чтобы лучше понять, что происходит?
Если понадобится дополнительная информация, я, вероятно, смогу ее предоставить.