使用新的iOS 10 SceneKit惊人的基于物理的渲染

毫无疑问,在移动设备上进行渲染时,Apple已开始使用它。 实时渲染和高级硬件的最新进展确实为获得高端结果提供了机会,而无需在设备上花费2000美元的价格。 尽管Apple的团队在WWDC 16’上介绍了许多进步,但是我真正注意到了一项改进,那就是SceneKit中基于物理渲染(PBR)的支持。 在过去的几年中,这种渲染技术获得了广泛的关注,并已成为工程师和3D艺术家的事实上的行业标准。

在这篇简短的文章中,我将尝试演示如何简单地使用新推出的iOS 10基于物理的渲染器,并在不具有任何高级图形引擎复杂性的情况下获得出色的效果。

在继续之前,我想坦诚地声明。 本文过度简化了一些概念,以使您对PBR中的关键元素有所了解。

基于物理的渲染

重要的是要了解不同的环境贴图会创建非常不同的渲染,因此请仔细选择您的环境贴图。 选择正确的环境图本身就是一门艺术,通常是由经验丰富的3D艺术家完成的。

物理渲染的材质定义

材料对于出色的PBR着色至关重要。 它们为我们的着色器提供了使这些惊人的可视化效果的基本信息。

过去,定义材料非常困难。 有上百万个参数需要调整,并且需要大量的魔术师和经验来使它正确。 此外,材料定义与照明非常相关,这在材料创建方面造成了问题。 使用PBR阴影,故事变得简单得多。 实际上,仅使用两个浮点数就可以很容易地获得视觉上令人愉悦的陶瓷,塑料或金属(请参见下文)。 基本上,您可能会达到相同的外观和感觉,但是艺术家将不得不工作几个小时才能获得他们想要的精美外观。

PBR材料的三个主要参数称为: 反照率,粗糙度金属度

反照率分量是对象的基础颜色,并且与其他着色模型的漫反射分量直接相关。 反照率值通常是RGB颜色,通常由3个浮点数定义。

粗糙度金属度 这些值描述了表面的粗糙度或金属感。 下图很好地说明了仅使用0.0-1.0范围内的浮点值来更改任一值对渲染结果的影响。

为了获得专业的效果,您将需要使用纹理,该纹理将为模型上的每个点定义不同的PBR组件。 幸运的是,大多数3D艺术家已经熟悉此着色模型,并发布了免费的材质定义,可以帮助您快速启动任何项目。

此外,iOS 10 PBR材质还支持其他贴图,例如法线贴图,这些贴图是可选的,但必须使用以获得良好的外观。

为了演示的目的,我使用了freepbr.com的一些资料。 如果要使用其他材料测试代码(如下),请确保将其签出。

编码时间

我们将一起创建旋转球的示例,如下所示。
无需担心-所有代码都在GitHub上发布。

首先,您需要了解一些先决条件:

  • 获得可用的最新macOS,iOS和Xcode beta版本-您不想因为Apple已经解决的错误而陷入困境。
  • 不要使用模拟器-始终使用支持金属的设备。
  • 这是Beta版软件-可能也会出现错误

准备看它有多简单? 我们走吧

我假设您有编写Swift代码的经验,并且您已经创建了一个SceneKit视图。 如果还没有,请从Game模板开始,然后选择SceneKit作为您的游戏技术。 您将获得的模板代码足以完成本练习(我在这里实际使用过……)

第一步:创建一个场景:

 让场景= SCNScene(名称:“ sphere.obj”)! 

如您所见,直接从OBJ文件初始化场景非常简单。 不需要复杂的C ++文件解析器。 我们将使用在3D Studio Max中创建的简单球体对象,该对象已经包含UV坐标,因此以后可以对其进行纹理处理(如果您不熟悉该概念,请立即阅读)。

第二步:创建一个相机并将其定位:

 让cameraNode = SCNNode() 
cameraNode.camera = SCNCamera()
scene.rootNode.addChildNode(cameraNode)
  cameraNode.position = SCNVector(x:0,y:0,z:1.5); 

如果您熟悉如何通过“ 场景图”表示场景 (因此称为“ 节点”概念),则这非常简单。

第三步:添加环境照明:

 让环境= UIImage(名称:“ IBL.png”) 
scene.lightingEnvironment.contents =环境
scene.lightingEnvironment.intensity = 2.0

前两行很容易说明,您可能想知道为什么我们要增加环境图的强度。 答案:在我的场景设置中看起来非常好! 是的,可能很难调整,但是就像现实世界中的电影制片人做一些无法解释的黑魔法来提高镜头质量一样,在计算机生成的场景中也是如此。 🙂没有耻辱

重要说明是,API正在根据图像的大小对图像进行一些假设。 老实说,我发现这是一种较差的编码实践,它更适合于硬件工程师,并且与API的其余部分不一致,但这就是生命。 确保您阅读了Apple的文档,并理解了Apple API要求的输入。 在我们的示例中,API从以下事实推断出我们提供了一个球形贴图: image_width = 2 * image_height

第四步:添加球形背景:

 让背景= UIImage(名称:“ IBLBlurred.png”) 
scene.background.contents =背景;

我们将使用的背景图像是我们的精确环境贴图,仅使用简单的高斯模糊滤镜进行模糊处理。 我们这样做只是为了用户体验,因为它非常酷,但是通过分配背景不会对照明产生任何影响。 附带说明一下,我要说的是,根据Apple的文档,如果场景中有PBR材质并且没有定义环境贴图,则PBR着色器将使用背景(如果存在)。 我尝试过这个。 它仍然不起作用。 再次-这是Beta版软件。

第五步:设置材料:

 让材质= firstNode.geometry?.firstMaterial 
 材料?.lightingModelName = SCNLightingModelPhysicalBased 
 材质?.diffuse.contents = UIImage(名称:“ albedo.png”) 
材质?.roughness.contents = UIImage(名称:“ roughness.png”)
material?.metalness.contents = UIImage(命名为:“ metalness.png”)
材质?.normal.contents = UIImage(名称:“ normal.png”)

我喜欢自我解释代码:),正如您在上面看到的那样,这里没有魔术。 我们找到了要编辑的材质对象,并分配了从艺术家那里获得的正确地图。 有关为这些材料属性分配内容的更多信息,请在Apple文档中查找。

第六步:将场景连接到您的SCNView:

 让scnView = self.view.subviews [0]为!  SCN查看 
scnView.scene =场景

祝你好运! 您的第一个PBR应用程序已启动并正在运行

我喜欢它! 下一步是什么?

还涉及许多其他主题,例如HDR照明,相机技巧和效果,光探测器,模型I / O框架,使用外部工具(例如3DSMax,Blender,Maya),修改着色器等等。 遍历Apple的文档和视频以查找这些瑰宝。 其中一些可以节省数十或数百个不必要的编码时间。 不要重新发明轮子

如果您想更深入地研究PBR阴影的数学和物理原理,建议您观看SIGGRAPH 2015的Naty Hoffman的精彩演讲。

如果您喜欢阅读的内容并希望继续阅读,请点击下面的♥-这确实为下一篇文章加油

Interesting Posts