【问题标题】:Unable to access _geometry variable in fragment shader无法访问片段着色器中的 _geometry 变量
【发布时间】:2017-08-12 15:28:26
【问题描述】:

我正在尝试在 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 转换回模型空间?

谢谢,

【问题讨论】:

    标签: scenekit fragment-shader


    【解决方案1】:

    _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 调试 UI - 我假设它仅在您在设备上运行时可用。谢谢。
    • 呃,你是对的,只是试图在模拟器中运行第二个解决方案......它不起作用。这是 Metal 与 OpenGL 的问题; SceneKit 对每个 3D 图形框架都有不同的着色器。 Metal SceneKit 着色器在片段着色器中有 scn_node 结构,而 OpenGL(由模拟器使用)没有。
    猜你喜欢
    • 2017-06-03
    • 1970-01-01
    • 2015-05-13
    • 1970-01-01
    • 2019-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多