![]() |
Dandelion 1.1.2
A light-weight 3D builder for educational usage
|
针对与渲染相关的实验,Dandelion 提供由 CPU 进行软渲染的功能。 更多...
文件 | |
| 文件 | graphics_interface.h |
| 一些公用的渲染管线接口。 | |
| 文件 | rasterizer.h |
| 光栅化渲染器中光栅化阶段的实现。 | |
| 文件 | rasterizer_renderer.h |
| 光栅化渲染器中顶点处理、片元处理两个阶段的实现。 | |
| 文件 | render_engine.h |
| 定义了渲染引擎和渲染器。 | |
| 文件 | triangle.h |
| 文件 | camera.h |
| 包含相机的类,用来表示场景中的相机。 | |
| 文件 | group.h |
| 包含物体组的类。 | |
| 文件 | light.h |
| 包含光源的类,目前只有一个点光源。 | |
| 文件 | object.h |
| 包含物体的类。 | |
| 文件 | scene.h |
| 包含场景的类。 | |
类 | |
| struct | GL::Material |
| 物体材质。 更多... | |
| struct | VertexShaderPayload |
| 顶点着色器的输入和输出单位。 更多... | |
| struct | FragmentShaderPayload |
| 片元着色器的输入单位。 更多... | |
| class | FrameBuffer |
| 一个最简化的 Frame Buffer 。 更多... | |
| struct | Uniforms |
| 用于存储 RasterizerRenderer 所需的全局变量。 更多... | |
| struct | Context |
| 存放实现渲染管线所需的一些全局数据。 更多... | |
| class | Rasterizer |
| 光栅化器 更多... | |
| class | VertexProcessor |
| 负责执行顶点着色器的工作线程。 更多... | |
| class | FragmentProcessor |
| 负责执行片元着色器的工作线程。 更多... | |
| class | RenderEngine |
| 离线渲染的执行入口 更多... | |
| class | RasterizerRenderer |
| 实现光栅化渲染管线。 更多... | |
| class | WhittedRenderer |
| 实现 Whitted-Style 光线追踪管线。 更多... | |
| class | Triangle |
| 表示一个三角形,包括三个顶点的世界坐标,视口坐标以及每个顶点的法向向量 更多... | |
| struct | Camera |
| 表示观察点的相机,既可以用于预览视角,也可以用于渲染视角。 更多... | |
| class | Group |
| 表示物体组的类。 更多... | |
| struct | Light |
| 表示一个点光源的类。 更多... | |
| class | Object |
| 表示物体的类。 更多... | |
| class | Scene |
| 表示一个包含相机、光源、物体等对象的完整场景。 更多... | |
| struct | Ray |
| struct | Intersection |
| 表示射线与 Mesh 相交结果的结构体。 更多... | |
枚举 | |
| enum class | BufferType { Color = 1 , Depth = 2 } |
| 用于选择 buffer 的类型 | |
| enum class | RendererType { RASTERIZER , WHITTED_STYLE } |
| 可用的渲染器类型 | |
函数 | |
| VertexShaderPayload | vertex_shader (const VertexShaderPayload &payload) |
| 计算顶点的各项属性几何变化。 | |
| Eigen::Vector3f | phong_fragment_shader (const FragmentShaderPayload &payload, const GL::Material &material, const std::list< Light > &lights, const Camera &camera) |
| 使用 Blinn Phong 着色模型计算每个片元(像素)的颜色。 | |
| Ray | generate_ray (int width, int height, int x, int y, Camera &camera, float depth) |
| 给定成像平面的宽度和高度、成像平面上的坐标、成像平面的深度和相机,生成一条射线。 | |
| std::optional< Intersection > | ray_triangle_intersect (const Ray &ray, const GL::Mesh &mesh, size_t index) |
| 判断光线ray是否与某个面片相交 | |
| std::optional< Intersection > | naive_intersect (const Ray &ray, const GL::Mesh &mesh, const Eigen::Matrix4f model) |
| 用朴素方法判断射线是否与给定的 mesh 相交。 | |
针对与渲染相关的实验,Dandelion 提供由 CPU 进行软渲染的功能。
虽然运行在 GPU 上的着色器语言 (shading language) 适合高效渲染,但由于 GPU 编程和 CPU 编程差异不小,单独讲授着色器语言会导致实验内容比较分裂。为了让同学更专注于光照、着色两类重要的渲染模型,我们统一使用软渲染的方式实现了两种渲染方法:
进行一次渲染需要三个要素:
这些要素都被包含于一个 Scene 对象中。渲染器应当提供一个 render 方法,接受一个 Scene& 类型的输入,按相机指定的视角,遍历场景中的物体和光源进行渲染。渲染结果应当写入到一个总长为图片宽度 \(\times\) 图片高度 \(\times\) 颜色通道数的 一维数组 中。这个一维数组应该是行优先的,可以被外界直接访问。
给定成像平面的宽度和高度、成像平面上的坐标、成像平面的深度和相机,生成一条射线。
| width | 成像平面的宽度(以像素计) |
| height | 成像平面的高度(以像素计) |
| x | 成像平面上指定点的 x 坐标(宽度方向,以像素计) |
| y | 成像平面上指定点的 y 坐标(高度方向,以像素计) |
| camera | 指定的相机 |
| depth | 成像平面在指定相机观察空间 (view space) 下的深度值(应当为正数) |
| std::optional< Intersection > naive_intersect | ( | const Ray & | ray, |
| const GL::Mesh & | mesh, | ||
| const Eigen::Matrix4f | model ) |
用朴素方法判断射线是否与给定的 mesh 相交。
这个函数顺序遍历 mesh 中的所有面片,逐一判断射线是否与之相交,最终取所有交点中 \(t\) 值最小的一个作为结果。
| ray | 射线 |
| mesh | 指定的 mesh |
| model | 这个 mesh 对应的模型变换矩阵 (model transform) |
| Eigen::Vector3f phong_fragment_shader | ( | const FragmentShaderPayload & | payload, |
| const GL::Material & | material, | ||
| const std::list< Light > & | lights, | ||
| const Camera & | camera ) |
使用 Blinn Phong 着色模型计算每个片元(像素)的颜色。
| payload | 装的是相机坐标系下的片元位置以及法向量 |
| material | 当前片元所在物体的材质,包括环境光、漫反射和镜面反射系数等 |
| lights | 当前场景中的所有光源 |
| camera | 离线渲染所用的相机 |
| std::optional< Intersection > ray_triangle_intersect | ( | const Ray & | ray, |
| const GL::Mesh & | mesh, | ||
| size_t | index ) |
判断光线ray是否与某个面片相交
这个函数判断是否与一个三角形面片相交
| ray | 射线 |
| mesh | 面片所在的mesh |
| index | 面片的索引 |
| VertexShaderPayload vertex_shader | ( | const VertexShaderPayload & | payload | ) |
计算顶点的各项属性几何变化。
首先是将顶点坐标变换到投影平面,再进行视口变换; 其次是将法线向量变换到世界坐标系
| payload | 输入时顶点和法线均为模型坐标系 输出时顶点经过视口变换变换到了屏幕空间,法线向量则为世界坐标系 |