Я пытаюсь написать шейдер для раскраски пользовательской геометрии в SceneKit.Я хочу установить цвета так, чтобы горизонтальные поверхности, которые обращены вверх, были белыми, горизонтальные поверхности, которые обращены вниз, были черными, а все остальные промежуточные поверхности - оттенками серого в зависимости от их ориентации.Я использовал точку входа поверхности материала для вызова следующего шейдера
vec4 normal = vec4(_surface.normal, 1.0);
// Assume value is [-1, 1], scale to [0, 1]
float color = normal.z * 0.5 + 0.5;
_surface.diffuse = vec4(color, color, color, 1.0);
. Похоже, что normal.z
относительно камеры (или вида).Я предполагаю, что мне нужно преобразовать значение, чтобы оно находилось в другом месте.Я пробовал несколько преобразований (и комбинаций преобразований), таких как u_inverseViewTransform
, но результаты все, похоже, находятся в поле зрения.Кто-нибудь знает, как раскрасить геометрию, основываясь на ориентации ее поверхностей?