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

时间:2017-03-21 05:31:16

标签: scenekit fragment-shader

我正在尝试在SceneKit中模拟深度贴图,我对3D编程很新。我在XY中创建了一个三角形网格,海洋深度为Z.计划是使用片段着色器在颜色之间缩放这个Z值以创建一个漂亮的地图

在着色器的文档中,它表示以前着色器中的值在以后的着色器中可用。特别是,第一个(几何)着色器具有名为_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转换回模型空间?

谢谢,

1 个答案:

答案 0 :(得分:2)

_geometry结构仅在顶点着色器中可用。

文档似乎表明u_inverseModelViewProjectionTransform应该作为统一变量存在,但我也无法使用它。

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

vec4 model_position = u_inverseModelTransform * u_inverseViewTransform * model4;

修改

当编译失败时,Xcode似乎无法转储整个SceneKit着色器,幸运的是,您仍然可以通过GPU调试UI查看完整代码。事实证明,您还可以访问片段着色器中的commonprofile_node结构。 以下是更好的解决方案。

vec4 model_position = scn_node.inverseModelViewTransform * model4;
祝你好运!