Dandelion 1.1.1
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 | 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) |
std::optional
对象,若相交,则此对象有值 (has_value() == true
);不相交则返回 std::nullopt
。 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 | 面片的索引 |
std::optional
对象,若相交,则此对象有值 (has_value() == true
);不相交则返回 std::nullopt
。 VertexShaderPayload vertex_shader | ( | const VertexShaderPayload & | payload | ) |
计算顶点的各项属性几何变化。
首先是将顶点坐标变换到投影平面,再进行视口变换; 其次是将法线向量变换到世界坐标系
payload | 输入时顶点和法线均为模型坐标系 输出时顶点经过视口变换变换到了屏幕空间,法线向量则为世界坐标系 |