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< Intersectionray_triangle_intersect (const Ray &ray, const GL::Mesh &mesh, size_t index)
 判断光线ray是否与某个面片相交
 
std::optional< Intersectionnaive_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\) 颜色通道数的 一维数组 中。这个一维数组应该是行优先的,可以被外界直接访问。

函数说明

◆ generate_ray()

Ray generate_ray ( int width,
int height,
int x,
int y,
Camera & camera,
float depth )

给定成像平面的宽度和高度、成像平面上的坐标、成像平面的深度和相机,生成一条射线。

参数
width成像平面的宽度(以像素计)
height成像平面的高度(以像素计)
x成像平面上指定点的 x 坐标(宽度方向,以像素计)
y成像平面上指定点的 y 坐标(高度方向,以像素计)
camera指定的相机
depth成像平面在指定相机观察空间 (view space) 下的深度值(应当为正数)
返回
构造出的射线

◆ naive_intersect()

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

◆ phong_fragment_shader()

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离线渲染所用的相机

◆ ray_triangle_intersect()

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

◆ vertex_shader()

VertexShaderPayload vertex_shader ( const VertexShaderPayload & payload)

计算顶点的各项属性几何变化。

首先是将顶点坐标变换到投影平面,再进行视口变换; 其次是将法线向量变换到世界坐标系

参数
payload输入时顶点和法线均为模型坐标系 输出时顶点经过视口变换变换到了屏幕空间,法线向量则为世界坐标系