java画_用Java画光

这位大佬最近在知乎专栏发布了一个系列教程:《用C语言画光》,在2D空间中阐释了光线追踪算法的原理。

我一口气读完了七篇文章,感觉收获很大。跟着他的脚步用C语言实现了这些算法后,意犹未尽,又用Java重新做了一遍。

项目代码已经上传到了github:jmecn/JLight2D

用Java画光,根据“用C语言画光”项目翻译而来。miloyip/light2d。

GUI

该项目本身是标准C语言控制台项目,我用Swing做了一个简单的界面,用来配置渲染参数。

00_SettingDialog.png

基础

使用蒙特卡洛积分(Monte Carol integration)和基于带符号距离场(signed distance field, SDF)的光线渐进(Ray marching)算法,渲染一个发光的圆。

源代码:

标准(Uniform)采样 (每个像素采样64次):

327ba6300db2dae5648c935655cdfeae.png

分层(Stratified)采样 (每个像素采样64次):

407dfd31ec4b735a457c75e76d8db4b0.png

抖动(Jittered )采样 (每个像素采样64次):

bb9708880d5ac75764d449f798ce4d61.png

构造实体几何

使用交、并、差等集合操作,构造多种几何模型:

382230c4194e850b2f4dce1377f3f704.png

6e62635bad33a5222d291ee5ece5e1da.png

b69133e24827760a1c4ae8bdd4152bee.png

反射

根据Csg表面的梯度计算法线方向,进而计算光的反射方向。假设物体表面的反射率是均匀的。

57169bcc109cff3a0b596b0806306573.png

2cd47fd169a6cbe5790f0aa5335f4d37.png

折射

应用斯涅耳定律计算光在不同介质中的折射方向。同时也处理了全反射。

f2d74d9842c9b99ec26ad18600e6e911.png

29835e12bbcf9b6f6c8968691cec4c8b.png

菲涅耳反射

应用菲涅耳公式计算光在电介质表面的反射方向。

未应用菲涅耳公式:

99349c449c91b05772e50896d0226230.png

应用菲涅耳公式:

4f18e66484ff7e0e1697ad00a072148b.png

比尔-朗伯定律

应用比尔-朗伯定律模拟光在电在传播过程中被介质吸收。

c7001f982729ad4967ef1cec2b365324.png

fec3f4704f56d0ca5ab40ae338e2369e.png

如果用去噪算法来对生成的图像滤波,渲染质量应该会更高。

期待大佬接下来的教程。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值