我是Shader Development的新手,目前正在SCNProgram上从事替代平面几何图形的渲染。
在程序顶点着色器中,我想访问节点/网格的位置(或基本上是锚点位置)点作为剪辑空间坐标。有没有简单的方法可以做到这一点,例如通过提供的节点缓冲区?我有点接近:
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/[email protected]/manual/Screen-Position-Node.html
我非常感谢您的任何提示。附带的是一些可视化效果。
如果我没看错的话,听起来您实际上想要的是节点中心的NDC位置。这与剪辑空间的位置略有不同,但是两者都可以在顶点着色器中计算为:
float4 clipSpaceNodeCenter = scn_node.modelViewProjectionTransform[3];
float2 ndcNodeCenter = clipSpaceNodeCenter.xy / clipSpaceNodeCenter.w;