图形学
文章平均质量分 75
图形学理论研究
隐士低手
这个作者很懒,什么都没留下…
展开
-
实时渲染中如何处理带积分的光照方程
在离线渲染中我们可以使用蒙特卡洛积分加上重要性采样来处理光照方程的积分问题,但是这个计算量非常大,在实时渲染中是无法使用的。实时渲染中会根据具体的问题选择不同的方法来处理积分问题,这篇文章列举了实时渲染中常见的处理积分的方法,主要是希望通过这几个例子了解其背后解决问题的思想,实时计算积分,肯定会使用预计算,算是空间换时间吧。实时渲染光照方程约等式这个约等式非常重要,很多地方都会用到。为什么要这个约等式,因为它可以将复杂的积分拆分成多个简单的积分,这样我们可以各个击破。但是这个约等式其实是错误的,只有满原创 2021-07-16 23:16:21 · 508 阅读 · 0 评论 -
实时全局光照总结
全局光照只考虑一次间接光照,核心问题是怎么找出次级光源以及如何高效的计算全局光照。RSMshadow map中存储了次级光源的信息,这些次级光源被当作diffuse材质,可以像四面八方反射光线,简单理解就是把每一个shadow map中的像素当成是一个点光源,每一个渲染点都需要去找能影响它的点光源。关键的问题是次级光源太多,我们需要根据屏幕空间的法线,世界坐标,深度信息对次级光源进行筛选,但是因为次级光源没有遮挡关系,所以RSM无法表达全局光照的阴影。这个算法通常用到手电筒上,因为这样的shadow m原创 2021-06-27 14:31:35 · 806 阅读 · 0 评论 -
环境光照总结
所谓环境光照其实是因为光源的各种弹射让环境中的所有物体都可以看作是光源,它所表现的效果是一种全局光照,但是在实现的时候我们是把它当成直接光照处理的。球谐函数球谐函数是一组基函数,我们可以通过这组基函数来表达复杂的函数,比如光照方程。不是所有的函数都可以被球谐函数表示,只有定义域在球面上的函数才可以。球谐函数类似于傅里叶变换,它可以分成很多层,每一层表示不同频率的信号,通常我们会使用较低层次的基函数来还原光照方程,这样就意味着,我们只保留了低频信号。因为diffuse光照其实就是低频信息,所以球谐函数适合原创 2021-06-26 15:59:15 · 728 阅读 · 0 评论 -
动态实时阴影技术总结
Shadow map基本实现思路两遍Pass:1.光源做为相机渲染一遍场景保存深度信息2.正常渲染的时候将坐标转换到上面的坐标系进行深度比较,如果深度大于shadow map,则表明这个点被遮挡只要是shadow map就会有两个严重的问题,第一个是自遮挡,第二个是锯齿,这两个问题的本质是因为shadow map的分辨率太低。因为shadow map贴图的分辨率过低,阴影贴图的一个纹素会对应多个像素,而这些像素在shadow map空间中的深度是不同的,因此就会出现自己遮挡自己的情况。如果太阳刚好在原创 2021-06-25 20:06:42 · 534 阅读 · 0 评论 -
DX12之手撸GPU Driven Pipeline
使用DX12手撸了一个GPU Driven Pipeline,前前后后大概花了一个月的时间,效率有点低,先总结一下为什么效率不高。1.图形API不熟悉,很多东西虽然概念上理解了,但在实际编写的时候你会很困惑,为了实现这个功能,该怎么使用这些API。因此我需要花费精力去熟悉DX12,主要的学习途径就是MSDN以及各种示例代码,龙书可以做为入门书籍,对dx12有一个大概的了解。2.调式困难,引擎开发最常遇到的两个问题崩溃和效果不对,崩溃往往都是和内存相关的问题。一旦崩溃很难定位,使用DX12开发功能是一原创 2020-08-31 11:20:56 · 2224 阅读 · 1 评论 -
DirectX12之代码中的流水线
今天看到一篇文章,讨论技术总监需不需要了解细节,我个人觉得技术总监了不了解细节不重要,重要的是遇到别人解决不了的问题,你行不行。技术无管理,至少管理对于这个岗位要求的并不高,毕竟我们程序员都是很简单的人。//***************************************************************************************// color.hlsl by Frank Luna (C) 2015 All Rights Reserved.//原创 2020-07-06 23:27:38 · 731 阅读 · 0 评论 -
坐标变换之相机空间之后的事情
3D游戏中的坐标变换一直都是基础中的基础,了解了坐标变换,你就了解了一个3d模型是如何转换到2D屏幕中的。模型空间->世界空间->相机空间->...->屏幕空间,这篇文章主要是介绍相机空间之后的事情。先来简单回顾一下模型空间到相机空间的转换,首先世界空间的变换矩阵是由缩放矩阵,旋转矩阵,平移矩阵组成的,缩放和旋转都是线性变换,因此它们可以用一个3乘3的矩阵表示,但是平移矩阵不是线性变换,为了能够把它融入到矩阵乘法中,我们需要使用齐次空间,就是将空间升维到4维空间,因此世界空间原创 2020-07-04 13:22:29 · 917 阅读 · 0 评论 -
游戏场景管理(六)BVH
BVH和空间划分技术不同,它并不是通过切割空间来管理场景中的物件。它是通过将物体分堆,然后在其上面包裹一层BV,达到管理场景的目的。树的根节点是一个能够包裹全部物体的BV,而树的叶子节点可能只是一个物件的BV,如下图:BV可以选择AABB,OBB,包围球等等,往往包裹性越好的BV,相交测试越复杂,但是包裹性好可以减少相交测试的次数。这个世界有阴就有阳,计算机的二进制码也是0和1,我们生存的世界是不是也是一个虚拟的程序呢,哈哈跑题了。父节点的包围体无需包裹子节点的包围体,但是需要包裹所有物体的BV原创 2020-07-03 13:35:04 · 1596 阅读 · 0 评论 -
MSAA那些事
先看一下百度的解释:超级采样抗锯齿(Super Sampling Anti-Aliasing)的原理是把当前分辨率成倍提高,然后再把画面缩放到当前的显示器上。这样的做法实际上就是在显示器尺寸不变的情况提高分辨率,让单个像素变得极小,这样就能够大幅减轻画面的锯齿感。不过由于对整个显示画面的放大,因此它消耗的显示资源也是非常大的。不过MSAA是寻找出物体边缘部分的像素,然后对它们进行缩放处理。由于只是物体的外层像素进行缩放处理,忽略掉了不会产生锯齿的内部像素,所以显卡不会像处理SSAA那样需要庞大的计算量,原创 2020-07-02 13:45:28 · 996 阅读 · 0 评论 -
游戏场景管理(五)空间划分
一 前言空间划分算法有很多,比如均匀网格,四/八叉树,k-d树,Bsp树,每一种算法都有自己的优缺点,我们需要从理论上理解这些算法,然后在实际项目中进行灵活的运用。游戏中经常使用空间划分算法来优化碰撞,视锥体剔除,邻近查询,因此每当我们讨论一个算法的时候都会从这三方面进行探讨。另外我们还将考虑静态对象和动态对象对算法的影响,主要体现在空间节点的快速更新能力,以及对象快速变更节点的能力。二 均匀网格算法我们可以把游戏场景均匀的划分成一个个小的网格如下图:我们先做一个约定如果游戏场景中每原创 2020-06-30 17:25:47 · 4972 阅读 · 0 评论 -
游戏场景管理(四)遮挡剔除
1.画家算法早期的gpu是没有z-buffer的,为了得到正确的图像,必须使用画家算法,也就是从后往前绘制几何体。几何体每帧都需要根据摄像机的位置进行排序,进而实现从后往前的绘制。画家算法不仅低效,还有一些无法解决的问题,比如几何体循环重叠:2.BSP树为了解决画家算法带来的问题,前辈大神们创建了bsp算法。bsp树可以根据相机的任意位置,快速的获得排序后的渲染几何体。而且在生成bsp树的时候可以对重叠的物体进行切割,从而解决循环重叠的问题。生成bsp树是一件很费时的事情,为了获得一棵相对平原创 2020-06-24 13:53:03 · 3346 阅读 · 1 评论 -
游戏场景管理(三)背面剔除
在图形渲染中有一个很大的敌人就是渲染不必要的多边形,比如处于背面的三角面片。拿起一本数,无论你怎么看最多也只能看到书的三个面,有的时候只能看到书的一个面。看不到的面我们完全可以把它剔除掉,这门武功就叫做背面剔除。如果是软光栅化,背面剔除通常在世界空间或相机空间中做,算法很简单如果平面的法线和视向量(平面上的一个点到视点的向量)的夹角小于90度那么这个三角面就是正面,否则是背面。这里的背面剔除只和平面法线及相机位置有关,与相机的朝向无关,也就是说即便背面剔除测试通过,这个三角面片也有可能不被渲染,比如它根原创 2020-06-21 22:31:33 · 2137 阅读 · 0 评论 -
游戏场景管理(二)视锥体剔除
在学习场景管理之前,我们要先学习一下视锥体剔除(VFC),因为无论你使用什么空间划分算法,划分的空间都要进行视锥体剔除,被剔除的空间内部的所有物件都会被抛弃以此来加速渲染或碰撞。这也是场景管理的核心目的。1.包围体(BV)与视锥体包围体就是把一个模型或空间包住的最小几何体,可以是球体,AABB包围盒,OBB包围盒。视锥体是一个被远近裁减面截断的锥体(6面体)。视锥体剔除就是判断包围体和视锥体的位置关系。不同的包围体与视锥体进行相交判断,复杂度是不一样的。这里的复杂度由低到高的顺序是球体<AAB原创 2020-06-19 15:36:30 · 4547 阅读 · 0 评论 -
游戏场景管理(一)
游戏中的场景管理,一个容易被忽视,但是却和游戏性能息息相关的问题。现在的手机游戏越来越重度,比如吃鸡,原神,这种大场景开放世界的游戏,场景中的物件成千上万,如何组织场景中的物件是一个非常棘手的问题,场景管理一般解决四个重要问题。视锥体剔除 遮挡剔除 碰撞检测 邻近查询游戏优化会使用多种裁剪技术来减少不必要的渲染。其中视锥体剔除是最重要的裁剪工作,我们只希望把视锥体中的物体传递给GPU进行渲染,视锥体之外的物体直接丢弃。如果场景中有1万个物体,简单的做法就是在每帧循环1万次,做1万次立方体与视锥体原创 2020-06-17 17:58:49 · 1156 阅读 · 1 评论 -
图形学坐标变换
在制作游戏的时候我们经常会遇到坐标变换,比如模型空间变换到世界空间,这里用到的数学知识就是线性代数中的矩阵变换。矩阵变换算上大学来来回回也学了好几次了,可是过一段时间就忘记了,这次更多的是从几何意义去理解矩阵变换,希望能够更深入的理解其中的原理。我自己也是个数学小白,这篇文章都是通过在网上学习,最后转换成自己的理解,不够严谨的地方,还请大家指出错误。在讲矩阵变换之前,先提一些基本概念。1.点和向量我们用一组数据表示点和向量比如(x,y,z)这组数据就是三维空间中的一个点或者向量。在计算机中我们是原创 2020-06-13 00:06:19 · 2603 阅读 · 0 评论 -
法线贴图使用中的疑问(一)
1.为什么法线要保存在切空间中?我们知道光照计算,只要保证各个向量在同一个空间坐标系下就可以算出正确的光照强度,那为什么我们在写shader的时候会在切空间进行光照计算呢?在回答这个问题之前,我们先来看看为什么法线要存储在切空间中。我们用排除法来说明这个问题,如果法线存储在世界坐标系中,只要物体在世界空间中发生了位置变化,这张法线贴图就失效了。为了解决这个问题我们可以把法线存储在模型空间中,就和模型的顶点一样,当模型发生旋转,平移的时候,法线只需要乘上相应的变换矩阵就可以转换到世界坐标系下。这看起来原创 2020-06-01 10:55:46 · 1659 阅读 · 0 评论