目录

一、变量形式

1.1 light

1.3  textures变量

1.4 faces变量

二、对于light的处理

2.1 ambient_light常数化光场

2.2 directional_light


源码参见如下链接,这里详细对源码进行解析。其实严格而言,光照部分是在栅格化操作之外的流程,因为这里涉及到光源对于三维物体的相互作用,作用结果是作用在物体的贴图上,严格而言并没有到栅格化的步骤。但是此步骤依然是比较重要的步骤。

另外有一点需要注意,就是Neural_renderer的光照只实现了平行光和常数化光场,并且只实现了漫反射的BRDF。如果需要其他光源形式或者漫反射形式的话,此源码只能起到参考作用,其他作用不大。

GitHub - FuxiCV/pt_mesh_renderer: A PyTorch implementation for the "Mesh Renderer"

​​​​​​https://arxiv.org/abs/2008.07154​​​​​​https://openaccess.thecvf.com/content_cvpr_2018/html/Genova_Unsupervised_Training_for_CVPR_2018_paper.html

一、变量形式

1.1 light

light的数量与面片一致,

    # create lightlight = xp.zeros((bs, nf, 3), 'float32') # [batch_size, num_faces, RGB]

最初的light的张量维度为 [batch_size, num_faces, RGB],即batch_size, 面片数量,作用到该面片上的光的颜色。通过这里,我们可以发现,light变量的作用是,模拟光源和每个面片的作用,即每个面片上光源的颜色。与最后的代码中我们也可以看到

    # applylight = cf.broadcast_to(light[:, :, None, None, None, :], textures.shape)textures = textures * light

这里,光源转换为面片一致的维度之后,直接与面片进行了乘法。

所以光源这个变量的作用就是计算每个面片上需要的光,然后直接与面片贴图相乘即可。

1.3  textures变量

此变量主要用于存储物体不同面片上的采样贴图。维度是[batch_size, num_faces, texture_size, texture_size, texture_size, RGB]。相当于,对于物体上的每个面片,是一个边长texture_size的三维张量。为什么每个面片上贴图是二维的,但用于表示此贴图的张量是三维的呢?主要是因为每个面片有三个顶点,贴图就是根据到三个顶点之间有三个距离,那到每个顶点对应于原始二维贴图上的不同的权重,根据距离三个顶点的距离权重的不同,生成了一个三维的张量。其中,texture_size越大,则渲染时贴图的分辨率越高。

此变量在后续栅格化过程中,用于生成图片时候的采样时会用到。在光照的过程中,此变量的作用是与light进行相乘。从而模拟光照的作用。

1.4 faces变量

这个变量用于记录物体的所有三维信息。对于多边形的物体,每个面片有三个顶点,即v1,v2,v3。每个顶点在三维空间中有三个坐标,xyz。 faces变量相当于存储了物体的三维信息,从而用于判断光源对于每个面片的入射角度,从而确定物体漫反射的光强。

二、对于light的处理

2.1 ambient_light常数化光场

对于常数化光场,即各个方向的光照均等,因此直接对光源进行增扩即可,即物体每个面片得到的光照均为color_ambient

    # argumentsif isinstance(color_ambient, tuple) or isinstance(color_ambient, list):color_ambient = xp.array(color_ambient, 'float32')if color_ambient.ndim == 1:color_ambient = cf.broadcast_to(color_ambient[None, :], (bs, 3))

2.2 directional_light

对于平行光,即有方向的光场,就需要考虑到光场和面片的相互作用了。面片是具有法向和位置的,光场是平行的,因此就是向量的点乘,不是像常数化光场一样的张量乘。

这里的处理是,直接根据物体的法向算出与光线的夹角,这样方向光场生成变量light的时候,直接根据夹角对光强度进行采样。light变量通过此操作,直接实现了光照到物体上的强度。

    if isinstance(color_directional, tuple) or isinstance(color_directional, list):color_directional = xp.array(color_directional, 'float32')if color_ambient.ndim == 1:color_ambient = cf.broadcast_to(color_ambient[None, :], (bs, 3))if color_directional.ndim == 1:color_directional = cf.broadcast_to(color_directional[None, :], (bs, 3))if direction.ndim == 1:direction = cf.broadcast_to(direction[None, :], (bs, 3))

面片法向计算:

    # directional lightif intensity_directional != 0:faces = faces.reshape((bs * nf, 3, 3))v10 = faces[:, 0] - faces[:, 1]v12 = faces[:, 2] - faces[:, 1]normals = cf.normalize(neural_renderer.cross(v10, v12))normals = normals.reshape((bs, nf, 3))

计算法向和光照方向的夹角:

注意,这里relu的作用就是让光照的背面不被渲染

        if direction.ndim == 2:direction = cf.broadcast_to(direction[:, None, :], normals.shape)cos = cf.relu(cf.sum(normals * direction, axis=2))

根据夹角计算相乘

        light = (light + intensity_directional * cfmath.mul(*cf.broadcast(color_directional[:, None, :], cos[:, :, None])))

如果对与整个光照流程比较熟悉的话,此源码读懂较为简单。同时因为源码没有考虑到面片之间的相互遮挡,只考虑到光照的直接作用,因此是较为简单的。如果涉及到面片之间的相互遮挡和影子,可能还需要用到z-buffer,具体流程可以参考openGL源码,博主没有研究过,这里暂不详细讨论了。

栅格化渲染源码解析-neural_renderer源码(二)光照部分相关推荐

  1. yolov3之pytorch源码解析_springmvc源码架构解析之view

    说在前面 前期回顾 sharding-jdbc源码解析 更新完毕 spring源码解析 更新完毕 spring-mvc源码解析 更新完毕 spring-tx源码解析 更新完毕 spring-boot源 ...

  2. TiKV 源码解析系列文章(二)raft-rs proposal 示例情景分析

    作者:屈鹏 本文为 TiKV 源码解析系列的第二篇,按照计划首先将为大家介绍 TiKV 依赖的周边库 raft-rs .raft-rs 是 Raft 算法的 Rust 语言实现.Raft 是分布式领域 ...

  3. Kafka核心源码解析 - KafkaController源码解析

    在进入源码解析之前,我先来介绍一些KafkaController在Kafka集群中的作用. (1)负责监听zookeeper上所有的元数据变更请求: (2)负责topic的partition迁移任务分 ...

  4. 源码 解析_List源码解析

    点击上方「10分钟编程」关注我呦 让我们在一起每天「博学」一点点,成为更好的自己! List源码解析 本篇文章有点长,所以先列个目录 List源码解析 1.ArrayList 2.LinkedList ...

  5. linux WiFi源码解析,WIFIDOG 源码解析

    WIFIDOG 源码解析 openwrt wifidog是我linux c语言编程的启蒙项目,一年前折腾此项目大半年,从此爱上了linux 系统编程.现在看来,这是一个再简单不过的linux c语言项 ...

  6. log4j 源码解析_Log4j源码解析--框架流程+核心解析

    OK,现在我们来研究Log4j的源码: 这篇博客有参照上善若水的博客,原文出处:http://www.blogjava.net/DLevin/archive/2012/06/28/381667.htm ...

  7. fceux源码解析_fceux源码解析_从源代码制作deb包的两种方法以及修改已有deb包(转载)...

    1. 原理 1) deb包通常包含两部分:控制信息(DEBIAN目录).安装内容(模拟"/"目录) 2) 通过解开已有的deb包看其中内容 i. 释放安装内容到dirname目录中 ...

  8. vue源码解析之选项合并(二)

    选项 data 的合并策略 我们跳过mergeData 以及 mergeDataOrFn,我们暂且不关注这两个函数的作用.暂且跳过继续看下面的代码: strats.data = function (p ...

  9. java解析java源码_JAVA语言-Java源码解析-Stack源码分析

    一.简介 stack类图.png 栈是数据结构中一种很重要的数据结构类型,因为栈的后进先出功能是实际的开发中有很多的应用场景.Java API中提供了栈(Stacck)的实现.Stack类继承了Vec ...

最新文章

  1. 双风扇安装图解_汽车灯光标志图解,汽车灯光标志大全图解
  2. xgboost模型参数详解
  3. java的网络工具netty简介
  4. 2015蓝桥杯省赛---java---C---9(打印大X)
  5. sed查找文件包含字段_sed(查找替换) 与awk(提取字段)
  6. 大屏做成这样,领导不重用你都难
  7. python可视化直方图的代码
  8. 连载丨《极简设计:苹果崛起之道》——硅谷伊甸园(二)
  9. 思科的雾计算对物联网有何推助力?
  10. C语言中各小写字母对应的ascal码值,asc2(ascall码对照表)
  11. MATLAB时域信号采样,信号时域采样 频谱分析(matlab)
  12. 如何查看电脑连接过的WiFi密码
  13. 金蝶KIS专业版V14.1即时库存查询表添加字段条形码|商品描述|最低最高存量
  14. axure中图表背影_Axure教程:如何制作可视化图表?
  15. 首次曝光!唯一全域最高等级背后的阿里云云原生安全全景图
  16. adams样条驱动_adams驱动中如何施加 正弦函数
  17. 高斯-克吕格(Gauss-Kruger)投影与UTM投影的区别
  18. 用c语言程序编写天干地支,农历中天干地支的计算【C代码】
  19. 在eclipse中直接运行JavaWeb项目时打开指定页面(默认的jsp)
  20. Kibana 汉化相关配置 i18n 及版本问题

热门文章

  1. 详解html中 offsetTop、clientTop、scrollTop、offsetTop 的各属性
  2. 风物长还需眼亮,星环助江苏银行大数据弯道超车
  3. Debian 10 操作系统ISO
  4. 【原创】OpenCV-Python系列之改变颜色空间(十三)
  5. C#中的Where的使用
  6. 依赖libcurl库实现sftp的下载功能
  7. KEGG Enzyme 数据库
  8. 微信朋友如何互动起来
  9. 考拉小巫的英语学习日记
  10. 电气工程转信息技术??我该如何规划未来的人生