无法访问片段着色器中的_geometry变量

问题描述:

我试图模拟SceneKit中的深度贴图,并且我对3D编程非常陌生。我已经在XY中创建了一个三维网格,其中包含Z中的海洋深度。计划是使用片段着色器在颜色之间缩放此Z值以创建一个漂亮的地图无法访问片段着色器中的_geometry变量

在着色器的文档中,来自以前着色器的值在稍后的着色器中可用。特别是,第一个(几何)着色器具有名为_geometry的结构,其中包含模型空间中的顶点。但是,由于某些原因,在我的片段着色器中没有定义,当我尝试使用它时出现错误。

失败编译的错误输出显示其他值可用,如_surface和_light,但不包含_geometry。

我试图从_surface.position vec3转换回模型空间,但恐怕我的转换已经超出了我的深度。根据这个值是考虑空间的文件,所以我尝试:

vec4 model4 = vec4(_surface.position, 1.0); 
vec4 model_position = u_inverseModelViewTransform * model4; 
if (model_position.z ..... 

但这不是给我的Z. u_inverseModelViewProjectionTransform的正确的价值观似乎不存在,要么。

我也试着写一个几何着色器是什么也没做只是为了确保_geometry存在于该着色并希望有几何着色器将包括在我的片段着色器_geometry但没有喜悦

我的问题是:我如何到达片段着色器中的_geometry变量,或者缺少该变量,如何将_surface.position转换回模型空间?

感谢,

_geometry结构是只在顶点着色器可用。

该文档似乎表明u_inverseModelViewProjectionTransform应该作为一个统一变量存在,但我还没有能够使用它。

作为一种解决方法,我一直在使用片段着色器中的以下内容来从视图到模型空间。

vec4 model_position = u_inverseModelTransform * u_inverseViewTransform * model4; 

编辑:

Xcode中似乎并不转储整个SceneKit着色器编译时失败了,幸好你仍然可以看到通过GPU调试UI的完整代码。原来你也可以访问片段着色器中的commonprofile_node结构。 以下是更好的解决方案。

vec4 model_position = scn_node.inverseModelViewTransform * model4; 

祝你好运!

+0

第一个建议工作恢复到正确的Z值。我试了第二次,但得到了关于scn_node没有被定义的错误。也许它没有在SceneKit着色器中定义?我不知道GPU调试用户界面 - 我假设它只有在设备上运行时才可用。谢谢。 – danielweberdlc

+0

呃,你是对的,只是试图在模拟器中运行第二个解决方案......它不起作用。这是一个金属vs OpenGL的问题; SceneKit为每个3D图形框架提供了不同的着色器。 Metal SceneKit着色器在片段着色器中具有'scn_node'结构,而OpenGL(由模拟器使用)不具有。 – lock