Xcode SCN程序顶点着色器–;检索节点剪辑空间坐标

Xcode SCN程序顶点着色器–;检索节点剪辑空间坐标,xcode,scenekit,metal,vertex-shader,scnprogram,Xcode,Scenekit,Metal,Vertex Shader,Scnprogram,我对着色器开发相当陌生,目前正在编写一个SCN程序来替换平面几何体的渲染 在程序顶点着色器中,我希望访问节点/网格的位置(或基本上是锚定位置)点作为剪辑空间坐标。是否有一种简单的方法可以实现这一点,可能是通过提供的节点缓冲区? 我有点接近: xCoordinate = scn_node.modelViewProjectionTransform[3].x / povZPosition yCoordinate = scn_node.modelViewProjectionTransform[3].y

我对着色器开发相当陌生,目前正在编写一个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(of buffernamed:…«在每一帧上)将其传递给我的着色器。不过我希望有更好的方法

在谷歌搜索时,Unity的等价物可能是:

如果有任何提示,我将非常感激。附件是一个小小的可视化


如果我读对了,听起来您实际上想要节点中心的位置。这与剪辑空间位置略有不同,但两者都可以在顶点着色器中计算为:

float4 clipSpaceNodeCenter = scn_node.modelViewProjectionTransform[3];
float2 ndcNodeCenter = clipSpaceNodeCenter.xy / clipSpaceNodeCenter.w;

非常感谢,沃伦,这很好用!