非真实性渲染(Non-Photorealistic Rendering)

2023-10-13 12:40

本文主要是介绍非真实性渲染(Non-Photorealistic Rendering),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

转载地址:http://blog.csdn.net/silangquan/article/details/17184807


提要

       真实性渲染追求的是像照片那样的渲染效果,NPR也叫艺术渲染,则有着很多的目的,一种目地就是将模型渲染成技术插图,只有需要的部分才会呈现。一张闪亮的法拉利渲染效果图在向客户销售汽车的时候会很有用,但对于修理汽车引擎的工程师,一副线稿才是更有意义。

        另一个NPR的应用领域是模拟绘画效果,比如铅笔,水彩等。这是一个巨大的领域,要获得特别的笔触也会涉及到大量的算法。




卡通渲染 Toon Shading

         不同的字体会给人以不同的感受,不同的渲染风格也会给人以不同的情感。Cel/Toon Shading 是NPR最常用的一种,他的名字源于Cartoon,有很强的梦幻感和童年感:最简单的方式,粗线条和色块了表示物体,通过简化和忽略季节增加场景的识别读。

          Toon Shading的风格很早就用于将3D模型融入到2D卡通动画中,还有很多游戏也用到了这个效果,比如武士3,波斯王子。 

        


        实现Toon Shading的方式有很多,在没有光照的情况下,只要通过量化纹理值就可以了。如果要进行光照着色的话,有两种方法:1.用单色填充多边形;2.用two-Toon,分别填充光照和阴影区域。可以敬爱那个光照计算的结果对应到调色板上,这种算法就和光照模型相关了。而模型的边缘通常渲染成黑色,突出卡通的效果。

        具体的着色方法是在Fragment shader中测试每个像素漫反射diffuse中的NdotL值,让漫反射形成一个阶梯函数,不同的NdotL区域对应不同的颜色。




         
 轮廓线检测 Silhouette Edge Rendering

          轮廓线的提取是NPR中关键的部分,有很多方式,可分为基于 Surface Angle,Procedual geometry,图像过程,向量边缘检测或者混合使用。这里主要提两种:Surface Angle  和 图像过程。

.Surface Angle Silhouetting

          这种方法主要利用了物体表面法向量n和观察向量v 的点积。如果点积接近0,那个这个就是物体的边缘。

 

        在上图中,P1和P2代表相机坐在位置,S是物体表面上一点,N是点S的法线。当我们在点P1观察物体的时候,S点很明显不能看成物体的轮廓,这个时候N和V1的点积值比较大,而在P2点观察的时候,S点左边的部分几乎是看不到的,这个时候N和V2的点积值很小,接近0,于是可以把S看成是物体的轮廓。

       方法非常简单,但这中技术只能对一些模型奏效,对于边缘变化比较大的物体,比如一个cube,这种算法是无能为力的。还有一个缺点是这种方法绘制出来的轮廓线宽度是不均的,因为依据的是物体表面的曲率。还有当某个多边形接近边缘的时候,可能整个多边形就全绘制成黑色了,这不是我们想要的。


. 图像过程  Silhouetting by image processing

         这个算法完全是基于图像的。

         首先分别渲染出场景的深度图像和法线图像




之后对法线和深度纹理使用查找边缘滤镜(例如索贝尔算子),可以生成边缘纹理。位于边缘的像素纹理为黑色,其他的为白色:


最后,边缘纹理和颜色纹理结合起来,生成最终渲染图:



            这种算法有很多好处:它处理了场景中全部物体,模型也不一定要完全封闭,因为这完全是基于图像的。不过在图像处理方面还是会有点小复杂。



其他风格 Other Styles




        上图实现的是铅笔画的效果。原理是用不同的纹理来代替原图中的不同灰度的物体。可以用纹理的不同通道来存储。比如,6幅不同的灰度图可以存在2个纹理中。这样多纹理通道可以选择合适的通道进行显示。通过pixel shader, 其显示不会浪费资源。







参考

非真实渲染(一)-  http://blog.csdn.net/bugrunner/article/details/5435078

openGL CG 系列教程07 – Toon Shader - http://blog.csdn.net/zhangci226/article/details/5596151

卡通渲染 - http://zh.wikipedia.org/wiki/%E5%8D%A1%E9%80%9A%E6%B8%B2%E6%9F%93

Real time rendering 3rd

转载地址:http://blog.csdn.net/silangquan/article/details/17184807

这篇关于非真实性渲染(Non-Photorealistic Rendering)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/203307

相关文章

OpenGL ES 2.0渲染管线

http://codingnow.cn/opengles/1504.html Opengl es 2.0实现了可编程的图形管线,比起1.x的固定管线要复杂和灵活很多,由两部分规范组成:Opengl es 2.0 API规范和Opengl es着色语言规范。下图是Opengl es 2.0渲染管线,阴影部分是opengl es 2.0的可编程阶段。   1. 顶点着色器(Vert

HumanNeRF:Free-viewpoint Rendering of Moving People from Monocular Video 翻译

HumanNeRF:单目视频中运动人物的自由视点绘制 引言。我们介绍了一种自由视点渲染方法- HumanNeRF -它适用于一个给定的单眼视频ofa人类执行复杂的身体运动,例如,从YouTube的视频。我们的方法可以在任何帧暂停视频,并从任意新的摄像机视点或甚至针对该特定帧和身体姿势的完整360度摄像机路径渲染主体。这项任务特别具有挑战性,因为它需要合成身体的照片级真实感细节,如从输入视频中可能

【鸿蒙HarmonyOS NEXT】调用后台接口及List组件渲染

【鸿蒙HarmonyOS NEXT】调用后台接口及List组件渲染 一、环境说明二、调用后台接口及List组件渲染三、总结 一、环境说明 DevEco Studio 版本: API版本:以12为主 二、调用后台接口及List组件渲染 后台接口及返回数据分析 JSON数据格式如下: {"code": 0,"data": {"total": 6,"pageSize"

【爬虫渲染神器】selenium 和pyppeteer 的动态渲染ajax反爬虫

许多网页是动态加载的网页,其中不乏使用了ajax异步技术,那么我们有没有一种渲染工具,直接省略分析过程,模拟浏览器渲染的操作呢,获取到我们想要的内容。当然有,下面我们介绍两种渲染工具的实战使用。 目标网站: http://www.porters.vip/verify/sign/ 点击参看详情页的里面内容。 前一篇文章,我们介绍了,js逆向分析两种方法JS逆向–签名验证反爬虫】sign签名验证

Apache Flink:Keyed Window与Non-Keyed Window

Apache Flink中,Window操作在流式数据处理中是非常核心的一种抽象,它把一个无限流数据集分割成一个个有界的Window(或称为Bucket),然后就可以非常方便地定义作用于Window之上的各种计算操作。本文我们主要基于Apache Flink 1.4.0版本,说明Keyed Window与Non-Keyed Window的基本概念,然后分别对与其相关的WindowFunction

class _ContiguousArrayStorage deallocated with non-zero retain count

Xcode报错 : Object 0x11c614000 of class _ContiguousArrayStorage deallocated with non-zero retain count 2. This object's deinit, or something called from it, may have created a strong reference to self w

如何将 Redshift Cryptomatte AOV 与 teamrender 结合使用,成都渲染101云渲染

这篇文章将讨论在 Cinema 4D 中将 cryptomatte AOV 与 teamrender 结合使用时常见的问题和解决方案。在 Cinema 4D 中使用 AOV 时,用户希望它们的工作方式与其他 AOV 完全相同。但事实并非如此,尤其是与 teamrender 结合使用时。  在 Cinema 4D 中,使用AOV 面板中的Multi-pass和Direct复选框之间的区别非常重要。

修改后无警告全面支持non-ARC以及ARC的OpenUDID

OpenUDID Open source initiative for a universal and persistent UDID solution for iOS. 首创的给iOS提供设备唯一标示符的一个开源代码. https://github.com/ylechelle/OpenUDID 使用很简单,引入头文件后执行下面一句话即可: 由于原版OpenUDI

vue中跳转当前页无法重渲染且报错问题

1、解决报错: // router/index.jsimport Vue from 'vue'import VueRouter from 'vue-router'Vue.use(VueRouter)// 解决报错👇const routerPush = VueRouter.prototype.pushVueRouter.prototype.push = function push(l

HarmonyOS开发实战( Beta5版)高负载组件的渲染实践规范

简介 在应用开发中,有的页面需要在列表中加载大量的数据,就会导致组件数量较多或者嵌套层级较深,从而引起组件负载加重,绘制耗时增长。虽然可以通过组件复用避免组件重复创建,但是如果每个列表项中包含的组件较多,在转场或者列表滑动的时候列表项就会一次性加载大量的数据,可能引起卡顿掉帧等性能问题。 转场场景 由于业务需求,从当前页面进入一个新页面时,会有转场动画播放,并且在动画首帧中加载新页面所需要的