次表面做的有些烦躁,既然如此,索性先记一下前一阵比较的PIXIE、3delight、prman的dice方式。

研究过reyes的人都知道dice,简而言之,就是为了生成高质量高精度的图片(电影CG),我们把一个grid或者叫patch打散成很多的microPolygon(以下简单记为mp),而每个mp的大小投影到屏幕上甚至小于一个像素(这个是可以设置的,mp的大小大约为一个像素的shadingrate倍)。对于四边网格,dice是很显然的,将grid投影到屏幕上,根据投影后的大小计算在u和v方向上分别需要细分多少份才能满足shadingrate,另外由于内存是有限的,grid的大小(dice之后grid上的点数)有一个用户设置的上限,如果dice后超出该上限,grid需要split成两个新的grid,然后再重复该过程。本文主要讲dice,四边的网格dice没什么好说的,几个引擎都做的差不多。但是,三角网格就需要比较tricky了。我觉得这也是我现在开始讨厌reyes的一个重要原因:总是不能统一的去做事情,三角的细分就不能跟四边的一样。可话又说回来,如果一样了,更是悲哀,比如pixie就是一样的,把三角网格的某个顶点看做长度无限小的边,然后跟四边一样dice,导致的后果就是靠近该点处会有过多的点被dice出来,多余的shade使得渲染速度变慢,而更糟糕的是这种singular会导致其它问题,比如计算dPdu时,发生除0(du为0)的错。3delight和prman采取了tricky的办法,将需要dice的三角形补全为四边形,三角形最长的边即为公共边,然后按四边网格采样,落在原三角形上的即为真正的采样点。

我们先看3delight,上图均为bake点云,然后显示的图。左侧的两图的原几何模型为两个等腰直角三角形,合并起来一个正方形,右侧的图分别展示了这两个三角形,都取非常大的shadingrate。左上角的为插值生成的点,这在bake点云时使用,用每个mp的中心点代表该网格,还包含该网格的亮度、面积、法向等信息。显然我们可以知道两点,一是dice时,边界点是重复计算的,二是插值取点,只取了mp是四条边的网格,边界处的三角形网格未插值取点,所以左上的图有一条大缝。

然后看prman。据我发现,prman与3delight的区别只是插值不同,如下图

prman在边界的三角形的mp上也插值取点了。下面隆重请出PIXIE:

圆盘大小代表面积,这个结果已经是我修改之后的视点无关的dice了,唯一的欠缺是没和前两个引擎那么tricky。

dice分为视点相关和视点无关两种,视点相关的,即细分的程度跟投影到屏幕上的大小相关,近处细分多,远处细分少;而视点无关的细分,只跟物体在世界坐标系内的大小相关,常用于bake点云。前面提到,如果PIXIE的视点相关的dice不够tricky,那么视点无关的dice简直不能直视,我觉得是错的,如下图:

更改之后好很多:

上面两幅图都是插值生成的点,不插值看起来也类似。现在唯一的困惑是3delight插值生成的图有pattern,如下:

但是,修改前的pixie也有类似的pattern,我觉得没道理。pixie有类似pattern,说明这是四边形的grid,四边形grid插值取点怎么能有缝隙呢?

prman和修改后的pixie(视点无关)已经没有该pattern了。

本想好好写篇博,可写着写着就发现乱了,其实不怪我。本身可变因素太多,而且完全正交,三个引擎、视点无关\有关、插值\不插值。

dice并没有多高深的知识在里面,但是dice的好坏会影响渲染的速度甚至质量。

如果有什么认识错误还请指正,虽然我有上面的图做”证据“,但是不少也是瞎猜的。

三种renderman规范引擎的dice对比的更多相关文章

  1. MySQL - 常见的三种数据库存储引擎

    原文:MySQL - 常见的三种数据库存储引擎 数据库存储引擎:是数据库底层软件组织,数据库管理系统(DBMS)使用数据引擎进行创建.查询.更新和删除数据.不同的存储引擎提供不同的存储机制.索引技巧. ...

  2. 国内常用的三种框架:ionic/mui/framework7对比

    国内常用的三种框架:ionic/mui/framework7对比 原文连接:http://zhihu.com/question/19558750/answer/91179040

  3. (转载)Nginx/LVS/HAProxy三种主流负载均衡软件的对比

    原地址:http://www.ha97.com/5646.html PS:Nginx/LVS/HAProxy是目前使用最广泛的三种负载均衡软件,本人都在多个项目中实施过,参考了一些资料,结合自己的一些 ...

  4. 基于Modbus三种CRC16校验方法的性能对比

    目录 1.背景介绍 2. CRC校验的三种方法 2.1. 直接计算CRC校验 2.2. 查短表法计算CRC16校验 2.3.查大表法计算CRC16校验 3.三种校验方式的测试方法 3.1.直接计算CR ...

  5. MySQL - 常用三种数据库存储引擎

    数据库存储引擎:是数据库底层软件组织,数据库管理系统(DBMS)使用数据引擎进行创建.查询.更新和删除数据.不同的存储引擎提供不同的存储机制.索引技巧.锁定水平等功能,使用不同的存储引擎,还可以获得特 ...

  6. epoll函数及三种I/O复用函数的对比

    epoll函数 #include <sys/epoll.h>int epoll_create(int size)int epoll_ctl(int epfd, int op, int fd ...

  7. OpenCL中三种内存创建image的效率对比

    第一种:使用ION: cl_mem_ion_host_ptr ion_host_ptr1; ion_host_ptr1.ext_host_ptr.allocation_type = CL_MEM_IO ...

  8. AMD,CMD,UMD 三种模块规范 写法格式

    一下三块均以 foo.js 为示例文件名,以 jQuery,underscore 为需求组件 ADM:异步模块规范, RequireJs 的支持格式 // 文件名: foo.js define(['j ...

  9. Android中三种onClick事件的实现与对比

    方式一:在activity的onCreate()方法中,嵌入如下代码: Button button = (Button)findViewById(R.id.button1); button.setOn ...

随机推荐

  1. Code First Migrations 数据迁移小记

    用了codefirst后一个很大的问题就是代码中的属性字段与数据库中表的同步问题,删掉数据库重新生成当然可以解决,不过数据就丢失了(当然通过代码中初始化数据库添加数据也可以解决,初始化的任务可以通过重 ...

  2. 给libpcap增加一个新的捕包方法

    libpcap是一个网络数据包捕获函数库,功能非常强大,提供了系统独立的用户级别网络数据包捕获接口,Libpcap可以在绝大多数类unix 平台下工作.大多数网络监控软件都以它为基础,著名的tcpdu ...

  3. android自动获取短信验证码

    前言:android应用的自动化测试必然会涉及到注册登录功能,而许多的注册登录或修改密码功能常常需要输入短信验证码,因此有必要能够自动获得下发的短信验证码.主要就是实时获取短信信息.android上获 ...

  4. datagrid 禁止点击行

    var s = $("#dg").datagrid('getPanel');            var rows = s.find('tr.datagrid-row');   ...

  5. SpringMVC流程

    Spring工作流程描述 1. 用户向服务器发送请求,请求被Spring 前端控制Servelt DispatcherServlet捕获: 2. DispatcherServlet对请求URL进行解析 ...

  6. C——没有bool的C语言?

    bool static my_var_initialized = false; 偶然写出了这样一句C代码,环境是visual studio 2012,工程是Compile as C的,竟然报了好几个错 ...

  7. 搭建apache http服务器

    异步: http://blog.csdn.net/lzhlzz/article/details/39496285

  8. Java集合类学习笔记(Set集合)

    Set集合不允许包含相同的元素,如果试图把两个相同的元素加入同一个Set集合中,则添加操作失败,add()方法返回false,且新元素不会被加入. HashSet类的特点: 不能保证元素的排列顺序,顺 ...

  9. JSFuck奇葩的js编码

    以前对黑客很崇拜,黑客的世界无比精彩.最近为了炫耀,想起了这段特殊的代码. [][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[ ...

  10. JUnit 4 单元测试

    Individual Project ——JUnit 4 单元测试 学习到JUnit单元测试,我拿来测试之前写过的一个计算器(两个依存类:Calc.java CalcFunction.java).代码 ...