无法访问片段着色器中的_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;
祝你好运!
第一个建议工作恢复到正确的Z值。我试了第二次,但得到了关于scn_node没有被定义的错误。也许它没有在SceneKit着色器中定义?我不知道GPU调试用户界面 - 我假设它只有在设备上运行时才可用。谢谢。 – danielweberdlc
呃,你是对的,只是试图在模拟器中运行第二个解决方案......它不起作用。这是一个金属vs OpenGL的问题; SceneKit为每个3D图形框架提供了不同的着色器。 Metal SceneKit着色器在片段着色器中具有'scn_node'结构,而OpenGL(由模拟器使用)不具有。 – lock