[toc] # 作业要求 实现 gltf 格式下的骨骼动画 PBR 材质 toneMap 模型是这个 Buster Drone # 实现 gltf 格式下的骨骼动画 gltf 格式解析: gltf 骨骼动画解析笔记 参考作业中的 gltfskinning 代码,先读取 gltf 文件中的 Animation 数据,需要用到的是 gltf 中的 skin 、 animations 、 samplers 、 nodes 、 accessors 、 joints 等字段 但是注意到上面 gltf 文件中实际上是没有 skin 和 joints...

[toc] # 体渲染的简单定义 假设在只需要模拟,不考虑微观物理的前提下 1、光线射入到体当中,行进的距离与密度成反比。 2、光线射入到体当中,发生碰撞的光的下一个方向是任意的,不像碰到金属物体发生任意方向的反射(其实不是任意的,它不可能指向金属内部),而光线在体中传递碰撞的方向是任意的。 在 RayTracing 中,可以将这种描述统一成一种材质 12345678910111213141516class isotropic : public material { public: isotropic(color c) :...

[toc] # RayTracing 射线检测伪代码 1234if (ray hits bounding object) return whether ray hits bounded objectselse return false 如上所示,最简单的例子中,每轮都需要遍历所有的对象。而且需要对每个对象进行射线检测 # 使用 BVH (或加速结构) 优化后的伪代码 123456if (hits purple) hit0 = hits blue enclosed objects hit1 = hits red enclosed objects if (hit0 or hit1) return...

[toc] # 什么是 Motion Blur 当我们使用 RayTracing 时,有很多效果可以暴力的进行实现,而不需要使用一些 Trick, 比如: Motion Blur, 在我们摄影时,如果想要拍摄出有延时感的图片效果,需要将快门在一段时间内持续的打开,拍摄当前时间下的照片。在所有照片拍摄结束后,对相片的每个像素加和求平均,就可以得到最后的 Motion Blur 效果的照片。 # 使用 RayTracing 来制作 Motion Blur RayTracing...

[toc] # Vulkan 对象创建 通常 Vulkan 的对象创建遵循以下顺序 - VK [Object] CreateInfo Object 可以为任何东西,比如 Image , 用于描述待创建物体的信息 - vkCreate [Object] 一般实际的创建有四个参数: - LogicDevice - Vk [Object] CreateInfo (上面说的) - userAllocator - Object 对象地址 比如上面的就先创建了 Buffer 的对象, 首先,创建了 Buffer 对象的描述对象, VkBufferCreateInfo 然后,调用内部接口...

[toc] # K-D Tree 是啥 k-D Tree (KDT , k-Dimension Tree) 是一种可以 高效处理 [k] 维空间信息 的数据结构。 # KD Tree 的思想 不断划分当前的点,选择一个 合适的维度 把空间划分,三维每次划分出四部分,二维每次划分出 2 部分 合适的维度 ,尽量保证两边数据量相差最小 (尽量保证树的平衡性) 合适的分割点 ,尽量选择对应的分割快内的中位数那个点 后插入与删除如何操作呢? 插入时,规定一个平衡因子 α, 如果某一个根节点下的节点数量大于这个 α 时,就执行局部重构 删除时,规定一个平衡因子 α, 将对应的删除节点标记为...

[toc] # 传统 RHI 和现代 RHI 传统 RHI 使用 RenderingContext 和状态机在 RHI 内部管理渲染流程和资源等 现代 RHI 基本把 GPU 接口都释放给你,自己去操作 # Vulkan 简单流程 初始化层 调用操作系统的 API 创建程序可以显示的窗口 (1) 初始化 Vulkan 程序和 Vulkan 库取得联系 Vulkan 和显卡设备取得联系 创建 Swapchain Vulkan 和显示窗口 (1) 取得联系 渲染主循环 输入 几何信息 Uniform … 输出 屏幕中显示的画面 逻辑 着色器 更新 CPU...

[toc] # ShadowMap ( 相机在光源位置 ) 每帧通过光源构建对于光源的一张深度图,视锥体采样时,判断对应点和光源连线上深度大小关系,若目标点深度大于深度图的深度,代表有阴影 # shadowmap 的问题 由于深度图的分辨率较小, 采样到的数值与实际值的差异 导致错误的判断是否是被遮挡 (当光源与地面夹角较大时容易出现,如夕阳西下时就很容易出现这种问题) 解决方法: 加一个 bias, 在浮动区间内都认为没被遮挡 ( 但是问题一般很大,bias的大小决定了丢失的多少 ) 次小 shadowMapping (工业界一般不用,且要求模型是 water...

[toc] # virtual Texture 视频中说,virtualTexture 会以一个中间 Texture 作为查找表来映射原始 Virtual Texturee 与实际 GPU 上存储的的 Physical Texture UV 关系 这个中间 Texture 实际上是一个查找表 这个查找表可以在 GPU 上生成 GPU 上实际存储的是从原始 Texture 中填充到 PhysicalTexture 中的大 Texture # virtual Texture Mipmap 同时,也可以将 mipmap 丢到 Physical Texture 上,同时做几层映射 #...

[toc] # 效果拆解 上图是一个现实中积水的地面的效果。那么该如何在图形中实现这个效果呢 首先我们可以将雨水拆解成无数的面片,然后将面片随机的分布在地表面上,如果想要控制雨水博文的纹路,可以自己用 Shader 或者贴图来修改雨水的形状 # 效果实现 # 1. ComputeShader 中计算面片的矩阵和时间 首先需要写一个 ComputeShader, 在 ComputeShader 中计算每个雨滴面片的随机位置 / 缩放等,并将其赋值给 4x4 的齐次转换矩阵,以及计算每个面片的随即速率。 然后将这些数据回读到...