SCNProgram Vertex Shader - получить координату пространства клипа узла

Я новичок в разработке шейдеров и в настоящее время работаю над программой SCN для замены визуализации геометрии плоскости.

Внутри программ вершинного шейдера я хотел бы получить доступ к точке положения (или, по сути, позиции привязки) узла / сетки как координаты пространства клипа. Есть ли простой способ сделать это, возможно, с помощью прилагаемого буфера узла? Я немного сблизился с:

xCoordinate = scn_node.modelViewProjectionTransform[3].x / povZPosition
yCoordinate = scn_node.modelViewProjectionTransform[3].y / povZPosition

Позиция pov z вводится извне через специальный буфер. Однако это нарушается, когда POV смотрит на сцену под углом.

Я подумал, что, вероятно, могу просто вычислить положение узла самостоятельно с помощью:

renderer.projectPoint(markerNode.presentation.worldPosition)

а затем пропускаю это через мой шейдер через "program.handleBinding(ofBufferNamed: …" в каждом кадре. Я надеюсь, что есть способ получше.

При копании в Google эквивалентом Unity, вероятно, будет: https://docs.unity3d.com/Packages/com.unity.shadergraph@6.9/manual/Screen-Position-Node.html

Буду очень благодарен за любые подсказки. Прилагаю небольшую визуализацию.

1 ответ

Если я вас правильно понимаю, похоже, что вам действительно нужна позиция NDC в центре узла. Это немного отличается от положения в пространстве отсечения, но оба могут быть вычислены в вершинном шейдере как:

float4 clipSpaceNodeCenter = scn_node.modelViewProjectionTransform[3];
float2 ndcNodeCenter = clipSpaceNodeCenter.xy / clipSpaceNodeCenter.w;
Другие вопросы по тегам