将CALayer设置为SCNMaterial的漫反射内容

Bra*_*art 9 objective-c calayer material ios scenekit

在过去的几天里,我一直在网上搜索无济于事.不幸的是,关于这个特定问题的苹果文档是模糊的,没有可用的示例代码(至少这是我发现的).您可能会问的问题似乎是什么......

我正在尝试将uiview的图层设置为用于渲染iPhone模型屏幕的材质内容(是的,幻觉:P).iPhone的屏幕UV映射设置为0到1,因此在将纹理/图层映射到纹素上时不会出现问题.

所以,不要让这个图层在iPhone上呈现,与左图像相同,相反,我将其渲染到iPhone上,就像右图一样

更正渲染不正确的渲染

在此输入图像描述

还要注意,当我设置一个断点并调试实际的iPhone节点并在Xcode中查看它时,会显示一个完全不同的渲染,当我继续执行时,该层会得到半固定:

奇怪的错误

现在......我如何解决这个问题??? 我尝试过使用漫反射内容变换矩阵,但没有任何修复.我也尝试将UIView调整为256x256(因为UV似乎是256x256,如blender所示 - 3d建模包),但这并没有解决任何问题.

这是图层的代码:

UIView *screen = [[UIView alloc] initWithFrame:self.view.bounds];
screen.backgroundColor = [UIColor redColor];

UIView *temp = [[UIView alloc] initWithFrame:CGRectMake(0, 0, screen.bounds.size.width, 60)];
temp.backgroundColor = [UIColor colorWithRed:0 green:(112.f/255.f) blue:(235.f/255.f) alpha:1];

UILabel *label = [[UILabel alloc] initWithFrame:CGRectInset(temp.bounds, 40, 0)];
label.frame = CGRectOffset(label.frame, 40, 0);
label.textColor = [UIColor colorWithRed:0 green:(48.f/255.f) blue:(84.f/255.f) alpha:1];
label.text = @"Select Track";
label.font = [UIFont fontWithName:@"HelveticaNeue-Light" size:30];
label.minimumScaleFactor = 0.001;
label.adjustsFontSizeToFitWidth = YES;
label.lineBreakMode = NSLineBreakByClipping;
[temp addSubview:label];

UIView *separator = [[UIView alloc] initWithFrame:CGRectMake(0, temp.bounds.size.height - 2, temp.bounds.size.width, 2)];
separator.backgroundColor = [UIColor colorWithRed:0 green:(48.f/255.f) blue:(84.f/255.f) alpha:1];
[temp addSubview:separator];
[screen addSubview:temp];
screen.layer.contentsGravity = kCAGravityCenter;
Run Code Online (Sandbox Code Playgroud)

编辑
甚至更奇怪的是,如果我使用以下方法捕获视图的UIImage:

- (UIImage *) imageWithView:(UIView *)view
{
    UIGraphicsBeginImageContextWithOptions(view.bounds.size, view.opaque, 0.0);
    [view.layer renderInContext:UIGraphicsGetCurrentContext()];

    UIImage * img = UIGraphicsGetImageFromCurrentImageContext();

    UIGraphicsEndImageContext();

    return img;
}
Run Code Online (Sandbox Code Playgroud)

并使用它作为漫反射的内容...一切都很好吗?!这是非常奇怪和令人沮丧的,因为图像的大小与uiview的大小完全相同......


编辑2

我最终只使用视图的图像作为纹理,这使得事物比我需要的更加静态.我不会将此作为答案,因为即使是在很长一段时间内,我仍然会等待正确解决这个问题.所以,如果你有一个答案并且这个主题已经打开了很长时间,请尽可能地碰到它.这部分的文档非常糟糕.

Bob*_*bjt 6

旧帖子上的新帖子,但是这个日期,可以将UIView本身设置为SCNMaterialProperty(diffuse)contents.直接从Apple的SceneKit工程部门传达支持此功能的意图,尽管文档尚未更新以反映它.

要绑定回原始帖子,请不要将UIView.layer设置为素材属性内容; 而是将内容设置为UIView本身.


ric*_*ter 4

SceneKit文档强烈建议,虽然在某些情况下您可以使用动画CALayers作为材质内容,但不包括UIView图层:

SceneKit 无法使用已在其他地方显示的图层(例如对象的背景图层UIView)。

这表明,如果您想为您的材质制作动画内容,最好使用完全单独使用的 Core Animation 或 SpriteKit。