卡通渲染总结《三》

接上回 卡通渲染总结《二》的描边技术,接下就是其绘画(The Painter)的技术。

Painter 的目的是从 3D 模型中生成平面图像。使用这种方法,可以通过改变阴影高光参数以及着色计算的权重因子来产生各种样式。

阴影部分

单光源

首先就是人物身上的阴影部分,通常通过硬阴影,也就是存在一条固体边缘,从光照区域过渡到阴影区域。

下面的式子就是计算光照的基本式子
在这里插入图片描述
C i C_i Ci就是顶点的颜色, a g a_g ag是全局环境光照系数, a l , d l a_l,d_l al,dl分别是物体材质的环境光和漫反射系数 L ‾ \overline{L} L是光源到着色点的方向, n ‾ \overline{n} n是着色点的法线 而 L ‾ ∗ n ‾ \overline{L} * \overline{n} Ln表示两向量点乘,可以表示该点接收光的比例。在传统光照中其为常量,但是在卡通渲染中可以根据角度采用不同的色块。

在这里插入图片描述
上图就表示了按照两者角度的cos值超过0.5和小于0.5划分成两种不同的颜色。并且文中提到,如果边缘出现了带有锯齿状的效果,可以使用图像API提供的纹理过滤进行处理,使得边缘更平滑,例如linear Filtering。
在这里插入图片描述

下图就是以这种方法的产生的阴影效果示例。
在这里插入图片描述
为了进一步的效率这类逐顶点的计算可以采用GPU进行加速计算。

预计算部分:

  • 计算光照diffuse颜色 :
    在这里插入图片描述
  • 计算阴影diffuse颜色:
    在这里插入图片描述
  • 将两种颜色结果分别存入一维的材质中的两端

实时计算部分:

  • 计算每个点的 M a x ( L ‾ ∗ n ‾ , 0 ) Max(\overline{L} * \overline{n},0) Max(Ln,0)
  • 取消光照对纹理进行采样着色

多光源

我们之前采用的都是单光源,接下去要讨论下多光源的问题。
在这里插入图片描述
在传统shadow map的计算方法中先从光源生成一个深度图,再从视角方向检查着色点的深度和深度贴图对比,如果视角方向的着色点深度大于深度图深度就说明没收到光照。

但这个方法的z-buffer的分辨率是固定的,当相机观察物体较大,而光源观察物体较小时候,阴影会存在锯齿。

有方法提出可以平均周围像素,但其会导致阴影和光照的表面中间不再有黑色边界。因此我们可以利用之前计算的 L ‾ ∗ n ‾ \overline{L} * \overline{n} Ln,判断每个点属于正面或者反面进行着色,但采用这个方法需要每个光源*每个顶点计算效率不够高,所以可以将两种结合下。 对物体上的cels 着色采样本方法,对多光源产生的投射阴影采样之前的shadowmap方法。

高光参数

此外,绘画中的镜面高光通常是不是为了真实性而是为了材质效果,Winnemoller继承了先前的方法并额外实现了添加高光的效果。

在这里插入图片描述
其中 R ⋅ V R \cdot V RV就是视角方向和反射方向的夹角,用于计算高光产生的程度。 α \alpha α表示高光的衰减程度。
在这里插入图片描述
上图可以看到添加高光之后,图片变得更加的丰满创意。

我们可以对之前的一维阴影材质进行扩充到二维来计算不同的高光效果。
在这里插入图片描述
但是高光的计算是需要实时的,因为他于视角的方向有关,会带来一定的计算负担,如何去降低负担是一个重要的问题。
我们从计算复杂度去考虑,一开始,每个顶点计算一次光照,每个三角形计算两次,一次是轮廓,一次是内部着色。
在这里插入图片描述
然后我们可以在三角形遍历的时候标记前后面,并减少着色的顶点百分比到b (b<1) 其实我们可以认为b接近0.5,因为大部分的面都是一正一反

此外我们也可以在遍历顶点的过程中,标记正反面,原理就是要计算顶点的法线朝向,一个顶点的法线朝向定义为其相邻三角形法线的平均的单位向量。当然由于一个面有三个顶点,我们可以自己定义(1-3)个顶点朝前就是正面。
在这里插入图片描述
由于少算了一半的面复杂度就是这样了。
在这里插入图片描述

最后还有一种操作就是把视角给固定下来,当然视角在固定下来时候肯定是有问题的,但是如果你离得够远就没太大问题,因为你的视角角度的范围较小。而离得近之后就会产生洞洞。下面就是逐渐走进后的视角。
在这里插入图片描述

在这里插入图片描述

起原因就是上图所示,原本应该是正面的面被认为是反面剔除掉了没渲染出来。红色箭头表示从固定的视角到当前视角的变换。 N s N_s Ns为S点的法线, N v N_v Nv为固定视角的法线。很明显固定视角中其cos值小于0,而当前视角确大于0 了。

当然这种固定视角也有其解决的方案,但总感觉不是很实用。

引用文献

WINNEMOLLER, H. 2002. Geometric approximations towards free specular comic shading. Computer Graphics Forum 21, 309316(8).

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/205350.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

docker网络【重点】

一、网络知识 1、桥接模式&#xff1a;用于链接两个不同网络段的设备&#xff0c;是共享通信的一种方式 2、桥接设备&#xff1a;工作在OSI模型的第二层&#xff08;数据链路层&#xff09;。根据MAC地址转发数据帧&#xff0c;类似于交换机&#xff0c;只能转发同一网段&…

状态设计模式

package com.jmj.pattern.state.after;public abstract class LiftState {protected Context context;public void setContext(Context context) {this.context context;}//电梯开启操作public abstract void open();//电梯关闭操作public abstract void close();//电梯运行操…

双目光波导AR眼镜_AR智能眼镜主板PCB定制开发

AR眼镜方案的未来发展潜力非常巨大。随着技术的进步&#xff0c;AR眼镜的光学模块将变得更小巧&#xff0c;像素密度也会增加&#xff0c;实现更高分辨率的画面&#xff0c;甚至能够达到1080P、2K和4K级别的清晰度&#xff0c;从而提升用户的视觉体验。 AR智能眼镜的硬件方面&a…

河南诗词大会规则和流程

河南省诗词大赛是一场充满诗意的盛会&#xff0c;分为小学组、中学组和社会组。流程包括四个环节&#xff1a;“大浪淘沙” 、“月宫折桂” 、“飞花令”和“诗画南阳”。 比赛前两轮为“大浪淘沙”和“月宫折桂”环节&#xff0c;所有赛手采用平板现场答题&#xff0c;时间为2…

企业培训私有化解决方案PlayEdu

本文应网友 林枫 的要求而折腾&#xff1b; 什么是 PlayEdu &#xff1f; PlayEdu 是一款适用于搭建内部培训平台的开源系统&#xff0c;旨在为企业/机构打造自己品牌的内部培训平台。PlayEdu 基于 Java MySQL 开发&#xff1b;采用前后端分离模式&#xff1b;前端采用 React1…

学习记录---kubernetes中备份和恢复etcd

一、简介 ETCD是kubernetes的重要组成部分&#xff0c;它主要用于存储kubernetes的所有元数据&#xff0c;我们在kubernetes中的所有资源(node、pod、deployment、service等)&#xff0c;如果该组件出现问题&#xff0c;则可能会导致kubernetes无法使用、资源丢失等情况。因此…

104.进程创建

目录 进程创建相关的函数 获取当前进程的进程ID&#xff08;PID&#xff09; 获取当前进程的父进程ID&#xff08;PPID&#xff09; 创建一个新的进程 fork()剖析 调用格式 创建子进程 子进程与父进程 父子进程执行流 代码演示 进程创建相关的函数 Linux中进程ID为pi…

『亚马逊云科技产品测评』活动征文|AWS云服务器EC2实例实现ByConity快速部署

授权声明&#xff1a;本篇文章授权活动官方亚马逊云科技文章转发、改写权&#xff0c;包括不限于在 Developer Centre, 知乎&#xff0c;自媒体平台&#xff0c;第三方开发者媒体等亚马逊云科技官方渠道 前言 亚马逊是全球最大的在线零售商和云计算服务提供商。AWS云服务器在…

vscode 配置 —— snippets、todo tree

一、snippets snippets 主要用于在进行文件及函数进行注释说明时&#xff0c;一键生成自定义格式注释 使用。 1.1 点击 vscode 设置&#xff0c;选择 User Snippets 1.2 编辑 code-snippets 文件 以C 文件注释为例&#xff0c;文件作用注释 fun_cpp_file.code-snippets &am…

新版IDEA中,module模块无法被识别,类全部变成咖啡杯无法被识

新版IDEA中&#xff0c;module模块无法被识别&#xff0c;类全部变成咖啡杯无法被识 如下图&#xff1a; 解决方法&#xff1a;java的Directory文件没有被设置为根目录&#xff0c;解决方法如下&#xff1a; 这是方法之一&#xff0c;还有很多的原因 可能的原因&#xff1a; …

【C语言】函数递归--输出n的k次方

题目描述&#xff1a; 递归实现n的k次方 代码如下&#xff1a; #include<stdio.h> int nk(int n, int k) {if (k > 0)return n * nk(n, k - 1); } int main() {int ret 0;int n 0;int k 0;scanf("%d", &n);scanf("%d", &k);ret nk(n…

【数据库】树形数据组织架构下的封锁并发控制,B树索引并发访问控制,树协议原理及案例分析

数据库并发访问树协议 ​专栏内容&#xff1a; 手写数据库toadb 本专栏主要介绍如何从零开发&#xff0c;开发的步骤&#xff0c;以及开发过程中的涉及的原理&#xff0c;遇到的问题等&#xff0c;让大家能跟上并且可以一起开发&#xff0c;让每个需要的人成为参与者。 本专栏会…

十六、FreeRTOS之FreeRTOS队列集

本节需要掌握以下内容&#xff1a; 1&#xff0c;队列集简介&#xff08;了解&#xff09; 2&#xff0c;队列集相关API函数介绍&#xff08;熟悉&#xff09; 3&#xff0c;队列集操作实验&#xff08;掌握&#xff09; 一、队列集简介&#xff08;了解&#xff09; 一个…

添加新公司代码的配置步骤-Part2

原文地址&#xff1a;配置公司代码 概述 在第一部分中&#xff0c;我讨论并列出了在 SAP 中构建新公司代码时企业结构部分所需的任务。在这篇博客中&#xff0c;我将列出并讨论 FI 模块中需要配置的内容。您还记得本主题涵盖六个部分。 企业结构 - 第 1 部分 FI 配置– 第 2…

【Linux】diff命令使用

diff命令 是一个用于比较两个文件或目录之间差异的命令。它可以显示两个文件之间的行级别差异&#xff0c;并以易于阅读的格式输出结果。 著者 由保罗艾格特、迈克海特尔、大卫海耶斯、理查德史泰尔曼和Len Tower撰写。 diff命令 -Linux手册页 语法 diff [选项] [文件1]…

【java设计模式】——代理设计模式,两种举例说明

代理设计模式 1.介绍 Spring 框架中AOP底层使用动态代理设计模式。通过学习动态代理设计模式可以很好的理解Spring框架AOP底层 代理模式&#xff08;Proxy&#xff09;是GoF23种设计模式之一。所谓代理模式是指客户端并不直接调用实际的对象&#xff0c;而是通过调用代理&am…

基于ssm家庭理财系统源码和论文

基于ssm家庭理财系统源码和论文743 idea 数据库mysql5.7 数据库链接工具&#xff1a;navcat,小海豚等 环境&#xff1a; jdk8 tomcat8.5 开发技术 ssm 摘要 随着Internet的发展&#xff0c;人们的日常生活已经离不开网络。未来人们的生活与工作将变得越来越数字化&#xff…

【文件上传系列】No.0 利用 FormData 实现文件上传、监控网路速度和上传进度(原生前端,Koa 后端)

利用 FormData 实现文件上传 基础功能&#xff1a;上传文件 演示如下&#xff1a; 概括流程&#xff1a; 前端&#xff1a;把文件数据获取并 append 到 FormData 对象中后端&#xff1a;通过 ctx.request.files 对象拿到二进制数据&#xff0c;获得 node 暂存的文件路径 前端…

PDF编辑器免费版有哪些?哪个好用?

日常工作和学习中,普通的PDF的阅读器通常无法进行编辑,更别说逆向导出成为Word、PPT或者Excel了。而且。市场上很多PDF编辑器还要收费。那么问题来了,PDF编辑器免费版有哪些呢?这就给大家安利几款,强烈建议收藏! PDF编辑器免费版一:PDF24 这款编辑器的功能有主要有PDF的合并、…

LiDAR 城市模型的 3D Python 工作流

1.引言 LiDAR&#xff08;Light Detection and Ranging&#xff09;是一种通过测量激光束从发射到返回的时间来测量距离&#xff0c;从而生成物体的三维表面模型的技术。这种技术在城市建模中具有广泛的应用&#xff0c;可以用于城市规划、环境监测、交通仿真等领域。而使用Pyt…