# pyrender **Repository Path**: loadtogitee/pyrender ## Basic Information - **Project Name**: pyrender - **Description**: 想了解光线追踪算法原理的欢迎来这个项目看看,项目使用Python+Taichi库从零开始构造一个光线追踪渲染器。包括详细的原理介绍文档。 - **Primary Language**: Python - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2024-01-21 - **Last Updated**: 2024-03-15 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # pyrender ### 介绍 pyrender在VScode框架下使用python 3.11.4,依靠Taichi库的GPU加速实现基于物理渲染的光线追踪渲染引擎。 ### 安装与运行 安装Taichi库 命令行指令: `pip install taichi` Taichi官网: `https://taichi-lang.cn/` 在VScode中可以直接在运行菜单中运行演示文件 或可以用python在samples目录下运行演示文件,如:`.\samples\test_box_tex.py` ### 演示示例说明 在演示文件中可以使用的功能 >wasd键进行摄像机平移 >鼠标左键按住并拖拽改变摄像机观看方向 >小键盘方向键的↑与↓可以在上下平移摄像机 >空格键进入属性调节界面并可调节灯光强度和物体的rgb属性、粗糙度等物体的材质属性 >删除键可以将渲染图片保存在'screen'文件夹中 演示示例 test_render test_render2 test_lens test_fresnel ### 原理 #### 一. 微平面理论(Microfacets) 当光投射在理想光滑平面上时会出现关于平面法线对称的反射光,而当平面较为粗糙时(非光学平坦表面)便会出现漫反射现象。粗糙平面在放大的微观尺度上表现为有随机朝向的理想镜面反射小平面的集合,及表面上每个点都会以略微不同的方向反射入射光。根据表面粗糙程度的不同微镜面的排列也会有很大差异,表面越粗糙,每个微镜面的排列就越混乱,也就是说表面越粗糙,射入的光线就越有可能向完全不同的方向反射,相反,越光滑的平面上光线越有可能按反射原理向根据法线对称的方向反射。 ![Microfacets](/doc/images/microfacets_light_rays.png "Microfacets") 但上述理论为物理实际的原理,在计算机中无法模拟微表面模型进行反射。所以我们构建以下模型来简化微平面。因为在足够粗糙的平面上的微表面造成的反射几乎可以完全随机的反射到该半平面的任意方向,当平面完全光滑时其反射角度完全关于法线对称。当平面的粗糙程度上升一些时,其反射角度将随机出现在一个较小的**反射叶**(specular lobe)中,随着平面粗糙程度的增加,其反射叶的范围也会逐渐增大,直至覆盖该平面的整个半球。 ![Specular Lobe](/doc/images/ibl_specular_lobe.png "Specular Lobe") #### 二. 蒙特卡洛积分(Monte Carlo integration) 为求解半球面上的定积分问题,我引入蒙特卡洛积分来进行求解。当我们要在一个地方进行平均身高调查时,我们可以简单的挨家挨户调查身高数据并除以该区域的总人口得到答案,但这样显然太过浪费时间,所以我们可以完全随机的取一部分人 N 进行抽样调查,N可以很小比如取100个人,测量后求平均值我们同样可以得到一个与之相近的答案,其中N越接近总数,得到的答案越准确,这就是所谓的大数定律。 在蒙特卡洛积分建立在大数定律的基础上,并在求解积分时用相同的方法。与其求理论上无限的x积分,不如随机的从总体和平均值中取N个样本值并求积分的结果。 ![Monte Carlo integration](/doc/images/monte_carlo_integration.png "Monte Carlo integration") 其中N为a到b中所取的随机值,将他们求和并除以总数得到平均值。pdf代表概率密度函数,表示待定样本在整体样本中出现的概率。 #### 三. 重要性采样(Importance sampling) ### 文章参考 关于渲染: 【基于物理的渲染(PBR)白皮书】 `https://github.com/QianMo/PBR-White-Paper/tree/master/content/part%201` 【Physically Based Rendering:From Theory to Implementation】 `https://pbr-book.org/4ed/contents` 【LearnOpenGL】 `https://learnopengl.com/PBR/Theory` `https://learnopengl.com/PBR/IBL/Specular-IBL` 【Probability Theory for Physically Based Rendering】 `https://jacco.ompf2.com/2019/12/11/probability-theory-for-physically-based-rendering/` 【Introduction to Raytracing: A Simple Method for Creating 3D Images】 `https://www.scratchapixel.com/lessons/3d-basic-rendering/introduction-to-ray-tracing/how-does-it-work.html` 关于矩阵变换: 【glRotate】 `https://docs.gl/gl3/glRotate` ### 特技 1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md 2. Gitee 官方博客 [blog.gitee.com](https://blog.gitee.com) 3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解 Gitee 上的优秀开源项目 4. [GVP](https://gitee.com/gvp) 全称是 Gitee 最有价值开源项目,是综合评定出的优秀开源项目 5. Gitee 官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help) 6. Gitee 封面人物是一档用来展示 Gitee 会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)