我正在尝试在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转换回模型空间?
谢谢,
答案 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;
祝你好运!