threejs-卡通轮廓效果(threejs模型轮廓发光)

在我的 3D 游戏和设计中,我经常选择可爱的低多边形卡通风格。我一直想给我的模型一个真正的卡通轮廓,所以这就是我们今天要做的工作。在以后的文章中,我们将着眼于为三角形着色以使其看起来也很卡通。

本文是「我正在进行的中等难度 ThreeJS 教程系列」的一部分。我一直想要在介绍“如何绘制立方体”和“让我们用疯狂的着色器填充屏幕”关卡之间找到一些东西。所以就在这里。

如果你在网上搜索“OpenGL 轮廓效果”,你会遇到很多相互矛盾的信息。经过大量研究,我确定有两种常用方法可以使用现代 3D 图形 API 创建轮廓。

  1. 绘制一个对象两次;一次是轮廓颜色,一次是正常。
  2. 通过在像素级别检测边缘的后处理效果运行整个场景。

第二种选择是当今 Unity 等现代游戏引擎中最常用的。但是我不想使用它,因为它涉及多个后处理步骤,这在移动 GPU 上可能很慢并且消耗更多内存。此外,后处理和 WebVR 目前还没有很好地融合,所以我暂时避免使用它。(当我介绍发光效果时,我们会重新讨论这个)。让我们关注第一种方法,两次绘制同一个对象。

两次渲染一个对象可能看起来很浪费,但请记住,大多数 GPU 都是带宽有限的。一旦你把几何图形传到 GPU 上,它就可以一遍又一遍地渲染同样的东西,几乎没有成本。在大多数情况下,我想概述的东西是静态几何。

让我们从两次渲染圆环结开始,一次是黑色,一次是黄色。完成这项工作的这个技巧是缩放轮廓,使其比主要对象略大。

//create a cubeobj = new THREE.Group()const c1 = new THREE.Mesh( new THREE.TorusKnotBufferGeometry(0.6,0.1), new THREE.MeshLambertMaterial({ color:’black’, }))const s = 1.03c1.scale.set(s,s,s)obj.add(c1)obj.add(new THREE.Mesh( new THREE.TorusKnotBufferGeometry(0.6,0.1), new THREE.MeshPhongMaterial({ color:’yellow’, })))

运行它,看看会发生什么。唔。根据您使用的几何形状,您将看到全黑或双色调、部分黑色和部分黄色的东西。还注意到一些从黄色中突出的黑色三角形吗?这就是所谓的z战斗。那么问题是什么。

threejs-卡通轮廓效果(threejs模型轮廓发光)

实际上,这有点道理。黑结略微扩大,因此在看不到黄色的地方,黑夜就在它的前面。那么我们该如何解决呢?

15 秒内解释剔除

我们将利用一个小技巧。

当 GPU 渲染三角形时,它通常只渲染正面的三角形。这些是面向相机的三角形。根据定义,任何背对相机的三角形都是不可见的,因此无需费心绘制它们。如果我们有一个球体,那么实际上只会绘制前半球。GPU 已「剔除」构成背面半球的三角形。

对于轮廓效果,我们希望仅使用正面几何图形绘制常规对象。这已经在发生。但是,对于轮廓,我们只希望绘制背面的三角形。然后它们将位于规则形状的后面,仅在边缘可见。

碰巧的是,ThreeJS 已经知道如何绘制正面和背面。我们只需要告诉它我们想要什么。下面的代码和上面一样,只是side正确设置了两种材质的属性。

obj = new THREE.Group()const c1 = new THREE.Mesh( new THREE.TorusKnotBufferGeometry(0.6,0.1), new THREE.MeshLambertMaterial({ color:’black’, side: THREE.BackSide }))const s = 1.03c1.scale.set(s,s,s)obj.add(c1)obj.add(new THREE.Mesh( new THREE.TorusKnotBufferGeometry(0.6,0.1), new THREE.MeshPhongMaterial({ color:’yellow’, side: THREE.FrontSide })))

现在看起来像这样:

threejs-卡通轮廓效果(threejs模型轮廓发光)

image.png

完美的!

修复法线

实际上不,它不是很完美。如果你仔细观察,你会发现物体背面的轮廓比正面的轮廓要细。那是因为我们只是在放大整个对象。这种幼稚的方法只适用于像球体这样的完美凸面物体。对于结或任何真实模型,我们需要正确地加厚几何图形。

碰巧大多数几何图形上已经有法线。这些法线垂直于几何体的表面。如果我们在法线方向上扩展点,那么一切都应该正常工作。我们可以通过稍微修改的顶点着色器来做到这一点。有关自定义顶点着色器的说明,请参阅其他文章。

//create a cubeconst mat = new THREE.MeshLambertMaterial({ color:’black’, side:THREE.BackSide })mat.onBeforeCompile = (shader) => { const token = ‘#include <begin_vertex>’ const customTransform = ` vec3 transformed = position objectNormal*0.02; ` shader.vertexShader = shader.vertexShader.replace(token,customTransform)}

上面的代码为轮廓对象创建了一个自定义材质。其余与之前相同。在着色器内部,它objectNormal向每个顶点的位置添加一小部分,将其向外扩展。将 更改0.02为更大的值以获得更粗的轮廓。

现在看起来像这样:

threejs-卡通轮廓效果(threejs模型轮廓发光)

image.png

壮丽的。您已经创建了一个类似于卡通的轮廓。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

(0)
上一篇 2024年5月14日 上午8:30
下一篇 2024年5月14日 上午8:42

相关推荐

  • 新组建的社工部去不去

    新组建的社工部去不去?这是一个值得探讨的问题。随着社会发展,社会服务的需求越来越大,而社工部作为社会服务的重要组成部分,其重要性也越来越凸显。但是,随着社工部组建时间的推移,一些问…

    联系我们 2024年12月5日
    1
  • 苹果电脑好用的安卓模拟器

    苹果电脑好用的安卓模拟器:轻松运行安卓应用,享受原生体验 苹果电脑是一款优秀的电脑设备,越来越多的用户开始使用它来运行安卓应用。但是,对于某些用户来说,苹果电脑可能并不适合用来运行…

    联系我们 2024年12月9日
    0
  • 运行此工具时出现问题0x80072f8f-0x20000

    运行此工具时出现问题0x80072f8f-0x20000 最近,有许多人都遇到了运行某些工具时出现问题0x80072f8f-0x20000的情况。这种情况通常意味着运行该工具的程序…

    联系我们 2024年12月11日
    2
  • 科研项目类别分为项目负责,项目参与

    科研项目类别划分项目负责和项目参与 科研项目的负责和参与是项目成功的关键因素之一。在项目中,负责的人负责确定项目的目标,计划和执行项目,并确保项目的成功。而参与的人则负责实际动手工…

    联系我们 2024年12月8日
    0
  • 科研完成指标有哪些

    科研完成指标有哪些 科研完成指标是衡量科研成果是否成功的关键。一个项目或研究的成功取决于是否能够实现预定的目标,这些目标通常包括确定研究课题、设计实验、收集和分析数据、撰写论文并进…

    联系我们 2024年12月7日
    0
  • 敏感项目管理

    敏感项目管理 敏感项目是指在其实施过程中涉及到敏感话题、利益相关方、知识产权、数据安全等问题的项目。对这些项目进行有效的管理是确保项目成功的关键因素之一。本文将介绍敏感项目管理的基…

    联系我们 2024年9月18日
    20
  • 开源cmdb项目

    开源cmdb项目 随着数据库应用的不断发展壮大,cmdb(Command-Line Buffer)数据存储格式逐渐成为了数据库应用的主流选择。cmdb数据存储格式具有高性能、可扩展…

    联系我们 2024年12月5日
    0
  • 弱电工程项目管理软件

    弱电工程项目管理软件 随着数字化时代的到来,弱电工程项目管理也变得越来越数字化。传统的手工管理方式已经无法满足现代弱电工程的需求,因此,使用弱电工程项目管理软件来进行项目管理变得非…

    联系我们 2024年9月18日
    25
  • 课题图文设计费

    课题图文设计费 随着数字化时代的到来,图文设计行业也日益发展壮大。作为一项专业的技能,图文设计费成为了许多人追求的事业。但是,对于初入门的新手来说,如何合理的收取设计费,以及如何与…

    联系我们 2024年12月11日
    0
  • 团队成员分工和合作情况

    团队成员分工和合作情况是团队建设的基础,决定了团队的工作效率和成果。在这篇文章中,我们将介绍我们的团队成员的分工和合作情况。 我们的团队成员由5名成员组成,每个人都有自己的特长和职…

    联系我们 2024年12月4日
    0