使用自定义曲面修改器时,ios Scenekit阴影会有所不同

时间:2017-10-26 10:02:58

标签: ios shader scenekit material shadows

我有一个有两架飞机的简单场景。与花纹理和阴影的第一架飞机在背景(墙壁纹理)的飞机上被投下。

我尝试使用表面修饰符 SCNShaderModifierEntryPointSurface ,阴影变得完全不同。现在它不再是花了它自己投下了飞机的阴影。

请参阅附图。

1。   enter image description here

2。 enter image description here

我的代码 花飞机

SCNPlane *planeGeometry = [SCNPlane planeWithWidth:16.0 height:8.0];
SCNNode *planeNode = [SCNNode nodeWithGeometry:planeGeometry];

第一张图片的代码是好的

planeGeometry.firstMaterial.diffuse.contents = [UIImage imageNamed:@"flowerTexture"];

第二张图片的代码不正常

NSString * surfModifier = ...;

planeGeometry.firstMaterial.shaderModifiers = @{SCNShaderModifierEntryPointSurface : surfModifier};
SCNMaterialProperty* diffuseTexture = [SCNMaterialProperty materialPropertyWithContents:[UIImage imageNamed:@"flowerTexture"]];

[planeGeometry.firstMaterial setValue:diffuseTexture forKey:@"mixTexture"];

和surfModifier着色器

uniform sampler2D mixTexture;

#pragma transparent
#pragma body

vec4 originalTexture = texture2D(mixTexture, _surface.diffuseTexcoord);
_surface.diffuse = originalTexture;

请帮助我让第二个工作

感谢

1 个答案:

答案 0 :(得分:1)

在渲染花卉平面节点时,将专门应用您的着色器。您基本上是对花卉平面节点进行后处理,之后不会影响对象上的阴影。

解决方案是基本上预处理花卉平面纹理,然后像在示例1中一样将其指定给平面。例如,使用Metal将花卉图像渲染为纹理,您仍然可以修改它使用着色器代码,然后将结果用作Scenekit中花朵平面的纹理。