SceneKit - 交叉渐变材质属性纹理

时间:2015-10-20 11:09:00

标签: opengl-es core-animation scenekit

SCNMaterialProperty.contents的文档声明它是一个可动画的属性,实际上我可以在两种颜色之间执行交叉渐变。但是我无法在两张图片之间交叉淡入淡出。

所以我开始怀疑这是否可行,或者我是否需要为此创建自定义着色器?

我尝试过隐式动画,在这种情况下,它会立即显示'after'图像:

.vjs-progress-control {  
  position: absolute;
  bottom: 26px; /* The height of the ControlBar minus 4px. */
  left: 0;
  right: 0;
  width: 100%;
  height: 10px; /* the height must be reduced from 30 to 10px in order to allow the buttons below (e.g. play) to be pushed */
}
.vjs-progress-holder {/* needed to have a real 100% width display. */
  margin-left: 0px;
  margin-right: 0px;
}

显式动画,不执行任何操作:

node.geometry.firstMaterial.diffuse.contents = [UIImage imageNamed:@"before"];
[SCNTransaction begin];
[SCNTransaction setAnimationDuration:5];
node.geometry.firstMaterial.diffuse.contents = [UIImage imageNamed:@"after"];
[SCNTransaction commit];

以及通过CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"contents"]; animation.fromValue = (__bridge id)[UIImage imageNamed:@"before"].CGImage; animation.toValue = (__bridge id)[UIImage imageNamed:@"after"].CGImage; animation.duration = 5; [node.geometry.firstMaterial.diffuse addAnimation:animation forKey:nil]; ,它什么都不做:

CALayer

2 个答案:

答案 0 :(得分:7)

根据我自己的测试,当涉及纹理值(而不是纯色值)时,看起来这个属性实际上是不可动画的。这可能是SceneKit中的一个错误(即它的目的是可动画,但它不起作用),或者它是Apple的文档中的一个错误(即它的错误)不打算动画,但他们说它是)。无论哪种方式,您都应该file that bug,以便在Apple修复它时收到通知。

(看起来这也不是特定于tvOS的问题 - 我也在OS X上看到它。)

我可以理解为什么动画纹理过渡可能不存在......从GL / Metal角度来看,这需要在过渡期间绑定额外的纹理单元并且每个像素(而不是一个)具有两个纹理查找。

我可以想到几个不错的潜在解决方法:

  1. 使用着色器修改器。写一个看起来像这样的GLSL(ish)片段:

    uniform sampler2D otherTexture;
    uniform float fadeFactor;
    #pragma body
    vec4 otherTexel = texture2D(otherTexture, _surface.diffuseTexcoord);
    _surface.diffuse = mix(_surface.diffuse, otherTexel, fadeFactor);
    

    使用SCNShaderModifierEntryPointSurface入口点在要设置动画的素材上进行设置。然后使用setValue:forKey:SCNMaterialPropertyotherTextureCABasicAnimation相关联,将fadeFactor的动画从0设为1。

  2. 使用更具动画效果的内容(如SpriteKit场景)作为材质属性内容,并设置动画以执行过渡。 (作为奖励,当你这样做时,你可以使用其他过渡风格。)

答案 1 :(得分:1)

你的动画没有发生,因为"内容"仅当设置为不是图像的颜色时,属性才是动画。您可以在Apple有关内容属性的文档中阅读。