2016-09-23 2 views
1

Я использую SceneKit для создания некоторой пользовательской геометрии. Это работает нормально, но я изо всех сил пытаюсь найти способ включения пользовательских атрибутов вершин. В частности, я хочу включить дополнительный SCNVector3 для каждой вершины.Пользовательские атрибуты вершин в SceneKit

Я нашел много примеров, которые используют shaderModifiers включить GLSL/Metal код, который опирается на пользовательские однородных значений, но не попадался путями, включая вершину атрибуты. Возможно ли это с помощью SceneKit или мое мышление назад?

ответ

3

, похоже, не существует способа доступа к источникам пользовательской геометрии в модификаторах шейдеров. Тем не менее, если ваши данные вписываются в float4, вы можете передать эти данные через SCNGeometrySourceSemanticColor.

Код примера Fox использует ту же технику для анимации клинков травы. Объем смещения выпекается в оттенки серого, как показано на рисунке ниже.

Data baked into the vertex colors

Наконец следующий модификатор шейдер считывает значение _geometry.color и гарантирует, чтобы сбросить его к чистому белому, так что сохраненные данные не влияют на конечный цвет объекта.

float offset = _geometry.color.x * (sin(1.2 * u_time + (_geometry.position.x+ _geometry.position.z)*4.0) + 0.5) * 0.02; 
_geometry.position.x += offset; 
_geometry.color.xyz = vec3(1.0); 
+0

Таким образом, черный означает невозможное смещение, белый - максимальное смещение. Понял. Но что означает «если ваши данные вписываются в float3 ...»? Где/как/каково это ограничение? – Confused

+1

Я обновил свой ответ с помощью 'float4' вместо' float3'. Ожидается, что SCNGeometrySourceSemanticColor будет содержать данные цвета. Это не более 4 поплавков для красного, зеленого, синего и альфа. Вы не можете использовать эту технику для выпечки данных, для которых требуется больше информации для каждой вершины (например, для преобразования). – mnuages

+0

Увлекательный. Я давно думал, что французские люди ценят прозрачность;) – Confused

3

Чтобы сделать нестандартную геометрию, можно использовать SCNGeometrySource объекты, чтобы обеспечить положение вершины, нормальное и текстурные координаты атрибутов с использованием буфера или Data объекта полных значений, а затем передать свои источники геометрии к SCNGeometryinit(sources:elements:) инициализатору.

Когда вы создаете SCNGeometrySource, вы связываете его с «семантикой», которая аналогична атрибуту вершины GL/Metal. Чтобы создать пользовательский атрибут вершин, просто укажите его как пользовательскую семантику. (В ObjC, SCNGeometrySourceSemantic просто ЬурейеЕ для NSString, так что вы можете предоставить свое имя строки. В Swift, SCNGeometrySource.Semantic это перечисление, как структура, что вы можете расширить создание новых членов с String сырья значениями.)

Чтобы использовать ваш пользовательский атрибут вершин в пользовательской шейдерной программе, используйте setSemantic(_:forSymbol:options:) для GL-шейдеров и (я думаю) handleBinding(ofBufferNamed:frequency:handler:) для металлических шейдеров.

+1

Часть этого вопроса о создании атрибутов определенно существует, но я не уверен на 100% в настройках шейдера (или шейдерного модификатора) для пользовательских атрибутов. @toyos, вероятно, знает об этих ... – rickster

+0

Является ли это похожим (по понятию) на то, как CGPath создает SKShapeNode и CAShapeLayer, в том смысле, что когда-то созданные изменения геометрии могут быть сделаны только путем замены геометрии, то есть без доступа к вершинная позиция? – Confused

+0

@Confused: да, вроде. Источники геометрии (буферы вершин в GL/Metal говорят) предназначены для отправки в память GPU один раз (когда вы помещаете узел с геометрией в свою сцену), чтобы вы не получали стоимость выполнения отправки каждого кадра. В SceneKit вы можете прочитать содержимое источника геометрии после его создания, но не редактировать их. (Существует функция изменения геометрии на графическом процессоре во время рендеринга [с помощью металлического вычислительного шейдера] (https://developer.apple.com/reference/scenekit/scngeometrysource/1522873-init).) – rickster

Смежные вопросы