SceneKit - 获取屏幕坐标中的位置

SceneKit - get position in screen coordinate

如何从几何着色器入口点获取屏幕参考中某个点的坐标? SceneKit 公开了一堆矩阵变换及其逆(https://developer.apple.com/reference/scenekit/scnshadable > 使用 SceneKit 提供的输入)但我不知道如何使用它们...

例如,在顶点着色器中执行的几何入口点,我试过:

varying vec2 screen_coords;

#pragma body
screen_coords = (u_inverseModelViewProjectionTransform * _geometry.position).xy

但这似乎不起作用:(

为了澄清,我希望 screen_coords 在 [0, 1] * [0, 1] 中,如果该点在屏幕中,具体取决于它的确切位置,如果不在屏幕中,则在其他位置。

我花了一些时间,但这是:

vec4 screenPos = u_modelViewProjectionTransform * _geometry.position;
screen_coords = (screenPos.xy / screenPos.w + 1.0) * 0.5;

说明: screenPos大致对应屏幕坐标space。 screenPos.xy / screenPos.w 重新缩放那些坐标。然后奇怪的是这给出了输入 [-1, 1] * [-1, 1] 所以我最后添加了一个偏移量和比例以获得 [0, 1] * [0, 1]

中的结果

对于将来偶然发现此问题的任何人,在金属中,我认为您只需通过抓取就可以在表面着色器中获得屏幕坐标

in.fragmentPosition.xy * scn_frame.inverseResolution.xy

See here for more info