
图形学
文章平均质量分 89
沉默的舞台剧
Keep running
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Uber Shader
Uber Shader,即全能着色器基本概念原创 2022-09-24 12:06:49 · 2183 阅读 · 0 评论 -
简单软光栅实现
软光栅原理与实现原创 2022-08-15 15:08:03 · 2162 阅读 · 0 评论 -
Global Illumination_Horizon-Based Ambient Occlusion(HBAO)
之前我们了解过AO与SSAO(可参照之前文章Vulkan_SSAO—屏幕空间环境光遮蔽和DirectX11进阶9_AO、SSAO、Particle System(GPU))。我们本次来看一下一种移动端友好的AO算法HBAO(Image-Space Horizon-Based Ambient Occlusion),相比SSAO对于每一个着色点需要进行64次(取决于随机点数量)采样,这对于移动端硬件来说采样率太高了(但可以用TSSAO来进行时空复用),因此目前手机主流的是采用HBAO来做环境遮蔽,而HBAO不原创 2021-08-14 11:41:05 · 2762 阅读 · 4 评论 -
Graphics_过度绘制(OverDraw)优化
本文主要参照《Real-Time Rendering》相关内容。early-z、z-cull、hi-z、z-perpass这四种技术本质上都是解决传统渲染管线中的同一个问题——过度绘制(OverDraw) 。一个经典的渲染管线通常会依次经历顶点阶段、光栅化、片元阶段和逐像素处理。其中片元阶段会进行复杂的光照计算,是整个管线的性能瓶颈。而在逐像素阶段会对计算出来的片元值进行各种测试以判断这个片元会不会最终显示到屏幕上。这就带来了一个矛盾:明明我在片元阶段花费了最大的力气计算出结果,但马上的逐像素阶段就可能将原创 2020-11-03 22:14:04 · 1090 阅读 · 0 评论 -
Vulkan_纹理mipmap生成与LOD
我们本部分主要来看一下:如何使用图像的位块和适当的图像屏障在运行时根据基本图像生成完整的纹理mipmap以及纹理LOD的使用。原创 2020-10-14 12:58:58 · 2654 阅读 · 0 评论 -
Vulkan_基于查询池的遮挡剔除
前面章节我们简单的使用了解过Vulkan_基于GPU的视锥体剔除和LOD与CPU中实现的视锥体剔除,本次我们主要来使用Vulkan的遮挡查询来实现视锥体内的遮挡剔除功能。想要具体了解所有剔除原理的同学,可以研读知乎图形大佬的这篇文章剔除:从软件到硬件。一、vulkan查询从Vulkan中读取冲统计数据的主要机制是依靠查询对象。查询对象通过池进行创建和管理,每个对象实际上是池中的一个槽(slot),而不是一个单独管理的离散对象。针对用户提交给设备的业务,有多种不同的查询对象可供使用,每种用于测量设备上原创 2020-10-07 18:44:30 · 1381 阅读 · 1 评论 -
Vulkan_骨骼动画的实现
上一部分我们主要讲了骨骼动画的原理,现在我们来对其进行实现:一、实现原理首先从骨骼动画的机制推导出驱动骨骼动画需要的数据: 模型骨骼树的结构数据,描述模型都有哪些骨骼,以及骨骼之间的连接关系。 每个顶点需要这些额外数据: 该顶点依附于哪些骨骼(即被哪些骨骼影响),以及每根骨骼的影响权重。 骨骼动画的关键帧数据,每个关键帧数据会保存每个骨骼在这个关键帧时间节点时相对父骨骼节点的变换矩阵, 每个关键帧还会保存自己对应的时间点。 动画通用数据: 名称, 持续时间等。上述数据就足以驱动一个骨骼动原创 2020-09-24 00:23:02 · 1688 阅读 · 0 评论 -
骨骼动画原理
动画相关理论详解一 、骨架骨架由一系列具有层次关系的关节(骨骼)和关节链组成,是一种树结构,选择其中一个是根关节,其它关节是根关节的子孙,可以通过平移和旋转根关节移动并确定整个骨架在世界空间中的位置和方向。父关节运动能影响子关节运动,但子关节运动对父关节不产生影响,因此,平移或旋转父关节时,也会同时平移或旋转其所有子关节。二、骨骼的表示通常会将关节进行编号0∼N−1,编号也称关节索引,通过索引查找关节比关节名查找高效的多。通常一个关节包含以下信息关节名父关节索引(根关节的父关节索引为-1,为转载 2020-09-19 00:07:22 · 2702 阅读 · 5 评论 -
GPU架构与管线总结
核弹厂有一篇关于自家GPU架构和逻辑管线的非常好的文章,如果你想要对GPU的结构有一个比较完整系统的认识,请一定不要错过这篇Life of a Triangle,本文主要参考此处进行总结归并。管线结构总图 为什么这一切如此复杂?因为在图形阶段我们必须处理由于创建大量变量导致的数据扩充。每个drawcall可能会生产不同数量的三角形。而经过剪裁后的点的数量与我们最初生成的又不一样。经过背面剔除和深度剔除处理后,不是所有的三角形都需要在显示在屏幕上的。一个三角形在屏幕上的尺寸就意味着需要百万的像素来显示原创 2020-09-13 14:29:38 · 7307 阅读 · 1 评论 -
【光线追踪系列十】光追加速结构(BVH树)
本文主要参照 Ray Tracing: The Next Week,其中只是主要精炼光追相关理论,具体实现可参照原文。经过之前几部分的光追实现,我们大致可以实现了光追的效果,但其中有一个致命的bug就是:慢!!!本部分我们就来解决这个问题。首先我们分析下:射线和物体的相交检测,是光线追踪器的主要时间瓶颈,目前时间复杂度是线性的。有两种方法可以将时间复杂度降低到对数级别:一是空间划分,二是物体划分。本节将用BVH实现物体划分,对当前的项目进行加速。一、层次包围体 BVHBounding volume原创 2020-09-05 23:02:10 · 10580 阅读 · 2 评论 -
【光线追踪系列九】物体动态模糊
一、动态模糊如果要实动态模糊的效果,可以将原来的球体,改成球心在某条线段上的球体,例如代码中将sphere修改为moving_sphere,并将原来的center修改成center0, center1。每条射线都会有一个随机的系数t(范围0到1),使用t插值center0, center1,得到这条线段上的某个点作为moving_sphere的球心。不同的射线会有不同的t,不同的t插值出来的球心位置就会不同。对某个像素随机采样ns次之后,这个像素就会产生ns条t值随机的射线,这ns条射线对应位置不同的球原创 2020-09-05 14:24:54 · 782 阅读 · 0 评论 -
【光线追踪系列八】动态相机、散焦模糊及最终光追效果
本次光线追踪系列从基础重新开始,主要参照 Ray Tracing in One Weekend ,具体实现代码框架见 https://github.com/RayTracing/raytracing.github.io/。本文只是主要精炼光追相关理论,具体实现可参照原文。原创 2020-09-04 23:16:43 · 1485 阅读 · 0 评论 -
【光线追踪系列七】折射与电介质材质
本次光线追踪系列从基础重新开始,主要参照 Ray Tracing in One Weekend ,具体实现代码框架见 https://github.com/RayTracing/raytracing.github.io/。本文只是主要精炼光追相关理论,具体实现可参照原文。电介质是水,玻璃和钻石等透明材料。当光线射到它们上时,它分裂为反射射线和折射(透射)射线。我们将通过在反射或折射之间随机选择,并且每次交互仅生成一条散射射线来解决这一问题。本节将会实现折射向量和电介质材质的光线追踪,例如玻璃材质。一、原创 2020-09-02 21:36:29 · 965 阅读 · 0 评论 -
【光线追踪系列六】反射与金属类特性
本次光线追踪系列从基础重新开始,主要参照 Ray Tracing in One Weekend ,具体实现代码框架见 https://github.com/RayTracing/raytracing.github.io/。本文只是主要精炼光追相关理论,具体实现可参照原文。本部分主要来实现反射函数及金属特性;一、材质抽象类 material接下来我们会涉及到处理不同的材质,所以我们可以封装一个材质类material。其中的抽象函数叫scatter(),意思为散射,因为射线起点和方向的改变,不一定是反射原创 2020-09-01 22:23:51 · 1313 阅读 · 1 评论 -
【光线追踪系列五】漫反射(Diffuse)
本次光线追踪系列从基础重新开始,主要参照 Ray Tracing in One Weekend ,具体实现代码框架见 https://github.com/RayTracing/raytracing.github.io/。本文只是主要精炼光追相关理论,具体实现可参照原文。本部分,我们来实现光线在漫反射材质表面反射的效果。一、漫反射原理如果光线射向漫反射材质物体(表面不规则),则反射光线具有随机的方向。以刚刚的场景为例,一个大球上面有个小球,材质均为漫反射材质。下面的三条射线,具有不同的随机反射行为:原创 2020-08-31 22:38:41 · 4480 阅读 · 0 评论 -
【光线追踪系列四】抗锯齿
本次光线追踪系列从基础重新开始,主要参照 Ray Tracing in One Weekend ,具体实现代码框架见 https://github.com/RayTracing/raytracing.github.io/。本文只是主要精炼光追相关理论,具体实现可参照原文。当真实的相机拍摄照片时,通常沿边缘没有锯齿,因为边缘像素是某些前景和某些背景的混合。通过平均每个像素中的一堆样本,我们可以获得相同的效果。我们不会为分层而烦恼。这是有争议的,但是在我的程序中很常见。对于某些光线跟踪器来说,它很关键,但是原创 2020-08-30 21:42:58 · 1271 阅读 · 0 评论 -
【光线追踪系列三】场景对象基类封装
本次光线追踪系列从基础重新开始,主要参照 Ray Tracing in One Weekend ,具体实现代码框架见 https://github.com/RayTracing/raytracing.github.io/。本文只是主要精炼光追相关理论,具体实现可参照原文。接着上一节定义单个球体功能后,我们可以想一下场景中,如果有很多个球体怎么办呢?如果光线命中特殊材质后发射了反射怎么办?我们可以通过以下解决方案来适用:1.将球体封装成类(为了场景中多模型适用)。2.一条射线的路径上可能会命中好几个原创 2020-08-30 21:16:52 · 379 阅读 · 0 评论 -
【光线追踪系列二】添加球体与表面法向量
本次光线追踪系列从基础重新开始,主要参照 Ray Tracing in One Weekend ,具体实现代码框架见 https://github.com/RayTracing/raytracing.github.io/。本文只是主要精炼光追相关理论,具体实现可参照原文。上一节中,我们以相机所处的原点(0,0,0)为起点,对屏幕的每个像素都发射一条射线,并实现了光线没有命中物体时,返回天空颜色的效果。本部分处理如果命中物体的情况。一、球体1.1 判断射线是否命中球体该项目的所有物体都是球体,因为射线原创 2020-08-30 10:22:41 · 1526 阅读 · 0 评论 -
【光线追踪系列一】PPM输出;自定义vec3;光线、简单相机及天空采样
本次光线追踪从基础开始从新开始,主要参照 Ray Tracing in One Weekend ,具体实现代码框架见 https://github.com/RayTracing/raytracing.github.io/。本文只是主要精炼光追相关理论,具体实现可参照原文。一、PPM输出1.1 PPM格式ppm是一种直接存储RGB颜色值的文件格式,第一行是p3,表示颜色值用ASCII存。第二行是图像的宽和高。接下来是每一行按顺序存放的颜色值。,具体实现可参照原文,本人实现效果如下:二、自定义ve原创 2020-08-29 21:48:43 · 1819 阅读 · 0 评论 -
【PBR系列七】基于物理的环境光照(下):镜面反射 IBL(Specular IBL)
本文核心知识主要参照learnopengl-cn文章总结归并,并根据个人学习方向进行了筛选摘抄,如有错误或不完整之处,可参照原文阅读。原创 2020-08-28 00:22:42 · 3505 阅读 · 6 评论 -
【PBR系列六】基于物理的环境光照(上):漫反射辐照度(Diffuse irradiance)
本文核心知识主要参照learnopengl-cn文章总结归并,并根据个人学习方向进行了筛选摘抄,如有错误或不完整之处,可参照原文阅读。一、漫反射辐照度(Diffuse irradiance)二、镜面反射 IBL(Specular IBL)基于图像的光照(Image based lighting, IBL)是一类光照技术的集合。其光源不是如前一节教程中描述的可分解的直接光源,而是将周围环境整体视为一个大光源。IBL 通常使用(取自现实世界或从3D场景生成的)环境立方体贴图 (Cubemap) ,我们可原创 2020-08-25 23:39:44 · 3163 阅读 · 0 评论 -
【PBR系列五】镜面反射BRDF模型(Specular BRDF)及实现效果
目前业界广泛采用的Microfacet Cook-Torrance BRDF形式如下:其中:D(h) : 法线分布函数 (Normal Distribution Function),描述微面元法线分布的概率,即正确朝向的法线的浓度。即具有正确朝向,能够将来自l的光反射到v的表面点的相对于表面面积的浓度。F(l,h) : 菲涅尔方程(Fresnel Equation),描述不同的表面角下表面所反射的光线所占的比率。G(l,v,h) : 几何函数(Geometry Function),描述微平面自原创 2020-08-21 23:51:36 · 8266 阅读 · 1 评论 -
【PBR系列四】PBR核心原理及材质属性查询
本部分将主要关注基于物理的渲染的核心理论与渲染的光学原理,以在整个系列中起到理论支柱的作用。首先放出本文主要内容提炼出的思维导图,即基于物理的渲染的核心理论与渲染光学原理的知识脉络:本部分将从以下几个方面,分别对PBR核心理论与渲染光学原理进行阐述:基于物理的渲染的核心理论渲染与人眼视觉渲染与物理光学(波动光学)渲染与几何光学真实世界材质的渲染属性总结一、基于物理的渲染核心理论总结在【PBR系列一】PBR知识体系内容前瞻与总结式的文章的开头中已经放出了PBR核心理念的简介版本,以下是P原创 2020-08-20 23:09:28 · 6145 阅读 · 0 评论 -
【PBR系列三】BRDF方程及渲染方程
BRDF方程及渲染方程一、BRDF方程通过上一部分所有辐射度量学各种概念的定义之后,我们可以从这样一个角度理解光线的反射,如下图所示:一个点(微分面积元)在接受到一定方向上的亮度 dE(wi) 之后,再向不同方向把能量辐射出去 dLr(wr)从直观的理解来说,不同物体表面材质自然会把一定方向上的入射亮度( dE(wi) )反射到不同的方向的光线上( dLr(wr)),如理想光滑表面会把入射光线完全反射到镜面反射方向,其它方向则完全没有。如理想粗糙表面会把入射光线均匀的反射到所有方向。因此所谓 BR原创 2020-08-19 22:29:19 · 9281 阅读 · 0 评论 -
【PBR系列二】辐射度量学理论
基于物理的渲染的核心理论渲染与人眼视觉渲染与物理光学(波动光学)渲染与几何光学真实世界材质的渲染属性总结原创 2020-08-18 22:19:54 · 5078 阅读 · 0 评论 -
【PBR系列一】PBR知识体系
参照知乎毛星云【基于物理的渲染(PBR)白皮书】(一) 开篇:PBR核心知识体系总结与概览原创 2020-08-17 23:49:10 · 3150 阅读 · 0 评论