- 博客(56)
- 资源 (3)
- 收藏
- 关注
原创 Untiy Decal 贴花
Forward Decal本质上的实现方法同Deferred Decal,都是从深度缓存重建物体空间位置,然后使用其中的xz轴作为纹理坐标进行的采样,和Deferred不同的地方在于Deferred Decal从GBuffer里读取Depth并且计算后的结果写进GBuffer的GI,Albedo,Normal,Forward Decal从DepthBuffer中取出DepthTexture然后输出ColorBuffer。对于一个着色点,只需要求出他的上下左右的位置信息,然后利用叉乘来近似计算该点的法线。
2024-08-02 18:08:00
790
原创 解析SPIR-V
首先,我们需要将每个着色器阶段从源代码文件编译为SPIR-V 文件。有多种工具可用于执行此操作,比如GLSlangValidator-它支持 Google #include 扩展。将顶点着色器代码放入名为“shader.vert”的文本文件中,将像素着色器代码放入名为“shader.frag”的文件中。运行bat文件,将保存两个.spv文件。
2024-08-02 18:01:46
434
原创 草的渲染理论
Unity引擎提供了基础的terrain工具,可以制作地形,在上面刷树刷草。对于,Unity是支持带的Prefab,,效果还不错。对于草,Unity支持两种方式来刷草,一种是,一种是。第一种实际上就是放一张图片,可以支持billboard,目的是营造一片草的错觉,这个只能远看,但是离得近,就穿帮了,尤其是在俯视的情况下,如下图。第二种是Add Detail Mesh,类似刷树,但是不支持LOD。1.使用面片+贴图 性能好但效果不好。
2024-08-02 18:01:13
1080
原创 Lambda
c++11引入了Lambda表达式,类似于一个匿名函数,拥有捕获所在作用域中变量的能力,能够将函数做为对象一样使用,通常用来实现等功能。
2023-09-27 23:16:45
263
原创 Vulkan Loader&Layer
也就是放在这个SDK里,类似各种Graphic Debugger的实现,Vulkan有很多Validation Layer,可以根据需求载入,在真正的函数调用之前,截取一些信息,获得一些信息,最后再调用真正的接口。任何一个vulkan api函数可以经过loader,layers和ICDs,loader负责将api传递dispatch给合适的layers和ICDs,vulkan对象模型允许loader插入layers层,并且组成调用链上一环,并最终传递给vulkan api给ICD。
2023-08-28 21:06:48
719
原创 Vulkan基础
客户端 + 服务端 / 逻辑段 + 渲染端 / CPU + GPUHost:一切由CPU与内存为基础进行的操作,例如模型的读取,鼠标键盘的事件响应,游戏引擎碰撞的逻辑,定时器等等。Device:一切由GPU与显存为基础的图形渲染、后处理等操作。
2023-08-21 16:49:42
860
原创 Vulkan Tutorial 10 重采样
这个新的缓冲区与我们一直在渲染的普通图像略有不同–它们必须能够存储每个像素的一个以上的样本。我们的程序现在可以为纹理加载多层次的细节,这修复了在渲染离观众较远的物体时出现的假象。现在的图像平滑了许多,然而仔细观察,你会发现在绘制的几何图形的边缘有锯齿状的图案。在普通的渲染中,像素的颜色是根据单个采样点确定的,在大多数情况下,这个采样点就是屏幕上目标像素的中心。我们也只使用一个mip级别,因为这是Vulkan规范在每个像素有一个以上的样本的情况下强制执行的。MSAA所做的是,它使用每个像素的。
2023-07-04 21:47:48
312
原创 Vulkan Tutorial 0 引言
这次旋风式的旅行应该让你对绘制第一个三角形的工作有一个基本的了解。一个真实世界的程序包含更多的步骤,比如分配顶点缓冲区、创建统一缓冲区和上传纹理图像,这些将在随后的章节中讲述,但我们将从简单的开始,因为Vulkan的学习曲线已经足够陡峭了。请注意,我们将通过最初在顶点着色器中嵌入顶点坐标而不是使用顶点缓冲器来欺骗一下。这是因为管理顶点缓冲器需要先熟悉一下命令缓冲器。所以简而言之,为了绘制第一个三角形,我们需要。
2023-06-08 15:56:52
930
原创 Vulkan Tutorial 9 模型加载&Mipmaps
向量包含很多重复的顶点数据,因为很多顶点被包含在多个三角形中。我们应该只保留唯一的顶点,并在它们出现的时候使用索引缓冲区来重用它们。它的速度很快,而且很容易集成,因为它是一个像stb_image一样的单文件库。在这一章中,我们还不会启用灯光,所以使用一个将灯光烘烤到纹理中的样本模型会有帮助。该网站上的许多模型都是以OBJ格式提供的,并有许可权。我调整了该模型的大小和方向,将其作为当前几何形状的替代品。在你的程序中放两个新的配置变量来定义模型和纹理的路径。不幸的是,我们还没有真正利用好索引缓冲区的优势。
2023-06-01 11:52:39
926
原创 Vulkan Tutorial 8 深度缓冲
深度缓冲区是一个额外的附件,它存储每个位置的深度,就像颜色附件存储每个位置的颜色一样。到目前为止,我们所处理的几何体是投射到三维的,但它仍然是完全平面的。我们将使用这第三个坐标在当前的正方形上放置一个正方形,看看几何体不按深度排序时出现的问题。与纹理图像不同,我们不一定需要一个特定的格式,因为我们不会直接从程序中访问纹理。它只需要有一个合理的精度,在现实世界的应用中,至少有24比特是常见的。格式,因为对它的支持是非常普遍的(见硬件数据库),但在可能的情况下,为我们的应用增加一些额外的灵活性也是不错的。
2023-05-31 12:16:11
988
1
原创 Vulkan Tutorial 7 纹理贴图
我们将从创建暂存资源并用像素数据填充它开始,然后将其复制到我们将用于渲染的最终图像对象。我们将首先创建这个缓冲区并用像素值填充它,然后我们将创建一个图像来将像素复制到。新建文件夹textures,放入图像texture.jpg,将其大小调整为 512 x 512 像素,但您可以随意选择您想要的任何图像。,这些布局会影响像素在内存中的组织方式。在对图像执行任何操作时,您必须确保它们具有最适合该操作的布局。stb_image库实现都写在头文件中,不需要编译成库,项目中直接引用头文件目录即可。
2023-05-30 14:59:10
1573
原创 Vulkan Tutorial 6 统一缓冲区
接下来的三个参数指定第一个描述符集的索引、要绑定的集的数量以及要绑定的集的数组。我们现在可以将任意属性传递给每个顶点的顶点着色器,模型-视图-投影矩阵将其作为顶点数据包含在内,但这是一种内存浪费。我们需要提供有关着色器中用于管道创建的每个描述符绑定的详细信息,设置一个新函数来定义所有这些信息,称为。到目前为止我们忽略的一件事是 C++ 结构中的数据应该如何与着色器中的统一定义匹配。将分配描述符集,每个描述符集都有一个统一的缓冲区描述符。函数,以实际将每个帧的正确描述符集绑定到着色器中的描述符。
2023-05-29 14:36:21
1108
原创 Vulkan Tutorial 5 顶点缓冲区
我们将用内存中的替换顶点着色器中的硬编码顶点数据。我们将从最简单的方法开始,即创建 CPU 可见缓冲区并使用memcpy直接将顶点数据复制到其中。顶点着色器首先更改顶点着色器,使其不再在着色器代码本身中包含顶点数据。顶点着色器使用关键字从顶点缓冲区获取输入in。顶点数据我们将顶点数据从着色器代码移动到程序代码中的数组。首先包括 GLM 库,它为我们提供线性代数相关类型,如向量和矩阵。我们将使用这些类型来指定位置和颜色向量。该stride参数指定从一个条目到下一个条目的字节数,该inputRate。
2023-05-29 11:44:01
1133
原创 Vulkan Tutorial 4
我们已经将渲染传递设置为期望一个与交换链图像格式相同的单一帧缓冲,但我们还没有实际创建任何图像。在渲染过程创建期间指定的附件通过将它们包装到一个对象中来绑定。帧缓冲区对象引用代表附件的所有对象。
2023-05-24 14:57:25
1065
原创 Vulkan Tutorial 3 图形管线基础
我们将设置一个图形管道,并将其配置为绘制我们的第一个三角形。图形管道是将网格的顶点和纹理一直带到渲染目标中的像素的操作序列。带有绿色的阶段被称为固定功能阶段。这些阶段允许你使用参数来调整它们的操作,但它们的工作方式是预定义的。另一方面,橙色的阶段是 “可编程”的。Vulkan的图形管道几乎是完全不可改变的,所以如果你想改变着色器、绑定不同的帧缓冲器或改变混合功能,你必须从头开始重新创建管道。顶点着色器处理每个进入的顶点。它将其属性,如世界位置、颜色、法线和纹理坐标作为输入。
2023-05-23 17:50:56
904
原创 Vulkan Tutorial 2 presentation
由于Vulkan是一个与平台无关的API,它自己不能直接与窗口系统对接。为了在Vulkan和窗口系统之间建立连接,将结果呈现在屏幕上,我们需要使用WSI(窗口系统集成)扩展。。它暴露了一个对象,它代表了一种抽象的表面类型,用于呈现渲染的图像。我们程序中的表面将由我们已经用GLFW打开的窗口来支持。实际上我们已经启用了它,因为它被包含在返回的列表中。在调试回调的下面添加一个surface类成员。尽管Vulkan的实现可能支持窗口系统集成,但这并不意味着系统中的每个设备都支持它。因此我们需要扩展。
2023-05-23 12:08:34
894
原创 Vulkan Tutorial 1 实例和物理设备
首先包括LunarG SDK的Vulkan头,它提供了函数、结构和枚举。iostream’头文件被包括在内,用于报告和传播错误initVulkanmainLoopcleanup之后的每一节都会增加一个新的函数,该函数将从initVulkan中调用,并在cleanup中为需要在最后释放的私有类成员增加一个或多个新的Vulkan对象。Vulkan对象要么用这样的函数直接创建,要么通过这样的函数分配给另一个对象。在确保一个对象不再被用于任何地方后,你需要用对应的和销毁它。
2023-05-23 10:51:57
972
3
原创 GAMES106笔记 - 现代图形绘制流水线原理与实践
顶点数据缓存(vertex buffer),索引缓存(inedx buffer),图元拓扑类型(Primitive Topology),Draw。但Vulkan创建多个实例,来分配不同的的物理设备,实现不同逻辑设备的与命令队列组合来更好利用GPU资源的能力。与opengl不一样,一般没有默认值,我们需要手动设置,例如深度检测等。根据程序选择队列簇,使用队列簇需要检查显卡是否支持,例如对物理设备调用。通常情况:一个实例,一个物理设备,一个逻辑设备,一个或多个队列。不同类型的队列来源不同的队列簇(
2023-05-11 15:31:12
516
原创 ILC VLM
这对于小型地图来说无伤大雅,但当游戏需要更大的世界,更大的地图的时候,它会同时带来内存的巨大增长和ILC查询插值性能的降低。此外,光照插值基于渲染物体的像素(即每个像素的光照SH系数是不同的)进行,跟ILC基于probe插值(即每个物件会插值出一个对应于物件所在位置的probe,之后使用这个probe的数据进行所有像素的着色)不同,这就是为什么VLM可以实现fog光照的原因,也可以用于解决当物件较大的时候,ILC得到的光照效果会周边lightmap计算得到的光照效果存在较大跳变的问题。
2023-04-12 11:08:16
135
原创 GAMES104 笔记 -渲染光和材质的数学魔法
1.如何在一点去得到入射的irradiance2.得到光源后,做shading计算,也就是半球上的lighting和材质brdf的积分运算十分expensive3.为了准确的计算irradiance,我们需要判断所有光源的贡献,由于场景中的所有物体均为光源,导致每一次计算的output会是下一次的input,从而导致无限迭代,这又扰乱了第一个challenge使其变得更加麻烦。
2023-04-09 19:48:18
1008
原创 FrameGraph Extensible Rendering Architecture in Frostbite
2007时是DICE的引擎,用于未来的battleField的产品,多平台DX9&10。10年后,2017年Frostbite成为EA的标准引擎,多平台DX12,在15款游戏以及未来的EA游戏中使用。07年的rendering system10年后,加了很多新特性,新平台,解决了很多新问题。简化的rendering system。最底下是,上面是。
2023-04-06 15:27:00
300
原创 StyleGAN 1.0
StyleGAN中的“Style”是指数据集中人脸的主要属性,比如人物的姿态等信息,而不是风格转换中的图像风格,这里Style是指人脸的风格,包括了脸型上面的表情、人脸朝向、发型等等,还包括纹理细节上的人脸肤色、人脸光照等方方面面。StyleGAN 用风格(style)来影响人脸的姿态、身份特征等,用噪声 ( noise ) 来影响头发丝、皱纹、肤色等细节部分。模型架构。
2023-02-15 17:07:15
579
原创 GAMES104 笔记 -如何构建游戏世界和游戏引擎中的渲染实践
游戏世界如何构建一个游戏世界?这个世界需要哪些东西这些东西如何被描述彼此之间如何被组织和调动起来1.动态物2.静态物3.环境(地形系统,支撑静态物和动态物的”托盘“)4.一些其他的物体这些物体其实可以抽象为缩写为GO。对于这些 GameObject 的描述基本可以分为两部分:属性(Property)和行为(BehaviorPropertyBehavior。
2023-02-14 17:46:01
533
原创 PyTorch
PyTorch提供了两个数据原语:torch.utils.data.DataLoader和torch.utils.data.Dataset,它们允许你使用预加载的数据集以及你自己的数据。此外,PyTorch 中有许多不同的优化器 可用,例如 ADAM 和 RMSProp,它们可以更好地处理不同类型的模型和数据。损失函数衡量的是得到的结果与目标值的相异程度,是我们在训练时想要最小化的损失函数。在单个训练循环中,模型对训练数据集(分批输入)进行预测,并反向传播预测误差以调整模型的参数。
2023-02-14 15:57:41
519
原创 Unity屏幕空间位置变换到世界空间位置的方法
屏幕空间像素的位置,是一个二维的浮点数,而世界空间的位置,则是三维的浮点数。实现的基本思路很简单,是世界空间位置变换到屏幕空间位置的逆过程,只是稍微有些区别。简单的说,世界空间位置变换到屏幕空间位置的步骤是这样的:世界空间变换到观察空间,观察空间变换到投影空间,然后裁剪空间第二步,裁剪空间变换到屏幕空间位置这里也可以分为两小步,透视除法和屏幕映射如果我们从屏幕空间位置反推世界空间位置的话,需要知道裁剪空间或观察空间的位置,然后直接乘逆矩阵变换到世界空间即可。
2022-09-14 16:35:23
1660
原创 UnityShader入门精要-9
Unity 5.0之前,有3种渲染路径:前向渲染路径(Forward Rendering Path)、延迟渲染路径(Deferred Rendering Path)和顶点照明渲染路径(Vertex Lit Rendering Path)。Unity5.0之后,顶点照明渲染路径已不建议使用(但Unity依然兼容);且新的延迟渲染路径代替了原来的延迟渲染路径(老版本的延迟渲染路径在Unity中依然兼容)。每进行一次完整的前向渲染,我们需要渲染该对象的图元,并计算两个缓冲区的信息:颜色缓冲区、深度缓冲区。先根据深
2022-06-08 15:15:54
611
原创 GAMES202 笔记 -Glimpse of Industry Solution
一、Temporal Anti-Aliasing(TAA) 在时间上的抗锯齿或反走样why aliasing? Not enought samples per pixel during rasterization一个像素中的样本数量不足 Therefore, the ultimate solution is to use more samples终极解决方案就是用更多的样本,也就是101中的MSAA TAA:当前帧会复用上一帧的sample,使得这一帧仍然用1SPP,但是无形中通过temp..
2022-04-02 12:40:35
3455
原创 UE4 基础类
UObject所有对象类的基础类-AActor, UActorComponentGarbage collection垃圾回收,对象可能被多个其他对象引用,在不需要使用的时候释放内存,可能产生野指针。 使用UPROPERTY宏进行标记,此类变量会被放进垃圾回收系统中,自动进行对象生命周期的管理。 UCLASS宏可用于标记从UObject派生的类,使UObject处理系统识别到它们。AActor AActor是所有Actor的基础类,AActor中有一个RootComponent成员,用来保存
2022-03-16 19:05:28
949
原创 GAMES202 笔记 -Real-Time Ray-Tracing
目录一、Real Time Ray Tracing(RTRT)RTX光路样本二、Industrial Sulution-temporalmotion vectorG-Buffers-几何缓冲区Back projectionTemporal Accum./Denoising三、Implementation of filteringGaussian filteringBilateral filtering-双边滤波Joint Bilateral filteri
2022-03-03 11:27:00
1128
原创 LearnOpenGL 笔记(四)-高级OpenGL下
八、高级数据缓冲函数OpenGL中的缓冲只是一个管理特定内存块的对象,在我们将它绑定到一个缓冲目标(Buffer Target)时,我们才赋予了其意义。glBufferData函数:分配一块内存,并将数据添加到这块内存中,如果我们将它的data参数设置为NULL,那么这个函数将只会分配内存,但不进行填充。4glBufferSubData:我们可以提供一个偏移量,指定从何处开始填充这个缓冲.缓冲需要有足够的已分配内存,所以对一个缓冲调用glBufferSubData之前必须要先调用glBuff
2022-03-01 14:31:12
1125
原创 GAMES202 笔记 -Real-Time Physically-Based Materials
目录一、PBR二、Microfacet models微表面模型F项:菲涅尔项D项:微表面的法线分布Beckmann模型GGX模型(TR模型)GTR(Generalized Trowbridge-Reitz)G项:Shadiowing-Masking-Geometry TermMissing energy?The Kulla-Conty Approximation三、LTC-Linearly Transformed Cosines四、Disney's pri
2022-02-27 23:16:32
1147
原创 GAMES202 笔记 -Real-Time Global Illumination
全局光照就是直接光照加上间接光照,通过模拟光线的传播路径,将物体反射的间接光纳入计算,从而提高结果真实感的一种渲染技术。在实时渲染中,全局光照是比直接光照多一次bounce的间接光照.如图中,光线弹射两次,先打到红色的墙壁上,在达到box面上,最后被camera/eye看到,这就是在rtr中要解决的所谓的"全局光照"。图右,从camera出发打出一条光线到点P,P点又往场景中不同的方向发射光线,如果打到光源则表示接受的是直接光照,如果没打到光源而是打到了点Q,那么我们认为P点接收到的光照是从
2022-02-25 23:11:35
933
原创 GAMES202 笔记 -Real-Time Environment Mapping
目录一、环境光照-无阴影二、Prefiltering三、BRDF项采样四、环境光照-阴影五、Basis Functions六、Spherical Harmonics(球谐函数)七、PRT八、Light transport九、小波一、环境光照-无阴影环境贴图就是在场景中任意一点往四周看去可看到的光照,将其记录在一张图上这就是环境光照,或者也可以叫做IBL(image-based lighing)我们用spherical map和cube map来存储环境光照.
2022-02-22 17:16:42
1176
1
原创 LearnOpenGL 笔记(四)-高级OpenGL上
一、深度测试深度缓冲是由窗口系统自动创建的,它会以16、24或32位float的形式储存它的深度值。在大部分的系统中,深度缓冲的精度都是24位的。深度缓冲是在片段着色器运行之后在屏幕空间中运行的。屏幕空间坐标与OpenGL的glViewport视口密切相关,可以直接使用GLSL内建变量gl_FragCoord从片段着色器中直接访问。gl_FragCoord中也包含了一个z分量,它包含了片段真正的深度值。z值就是需要与深度缓冲内容所对比的那个值。gl_FragCoord的x和y分量代表了片段的屏幕空间
2022-02-22 00:05:28
2903
原创 GAMES202 笔记 - Real-time Shadows
1-pass我们从Light处看向场景并输出一个从light处看向场景所生成的深度图,也就是所谓的shadow map.2-pass我们从camera处看向场景渲染一遍将,并参考1-pass生成的shadow map去判断物体是否在阴影中.shadow mapping是一个完全在图像空间中的算法,其优点:一旦shadow Map已经生成,就可以利用shadow map来获取场景中的几何表示而不是场景中的几何.其缺点:会产生自遮挡和走样现象.从Light处看向场景生成的是shadow map...
2022-02-19 17:36:13
2318
原创 LearnOpenGL 笔记(三)-高级光照
十五、Blinn-Phong冯氏光照不仅对真实光照有很好的近似,而且性能也很高。但是它的镜面反射会在一些情况下出现问题,特别是物体反光度很低时,会导致大片(粗糙的)高光区域。出现这个问题的原因是观察向量和反射向量间的夹角不能大于90度。左图中是我们熟悉的冯氏光照中的反射向量,而右图中,视线与反射方向之间的夹角明显大于90度,这种情况下镜面光分量会变为0.0。引入了Blinn-Phong着色模型它对镜面光模型的处理上有一些不同。Blinn-Phong模型不再依赖于反射向量,而是采用了所
2022-02-17 18:19:15
1363
原创 LearnOpenGL 笔记(二)-光照
九、颜色定义物体的颜色为物体从一个光源反射各个颜色分量的大小。创建一个光照场景首先我们需要一个物体来作为被投光(Cast the light)的对象,光源。为灯创建一个新的VAOunsigned int lightVAO;glGenVertexArrays(1, &lightVAO);glBindVertexArray(lightVAO);// 只需要绑定VBO不用再次设置VBO的数据,因为箱子的VBO数据中已经包含了正确的立方体顶点数据glBindBuffer(GL_
2022-02-13 14:41:23
719
原创 LearnOpenGL 笔记(一)
一、概述OpenGL到底是什么一般它被认为是一个API(Application Programming Interface, 应用程序编程接口),包含了一系列可以操作图形、图像的函数。OpenGL规范严格规定了每个函数该如何执行,以及它们的输出值。实际的OpenGL库的开发者通常是显卡的生产商。OpenGL库是用C语言写的,同时也支持多种语言的派生,但其内核仍是一个C库。核心模式与立即渲染模式早期的OpenGL使用立即渲染模式,OpenGL的大多数功能都被库隐藏起来,开发者很少有控制
2022-02-12 23:27:24
1598
1
ProRoadv1.2.174.unitypackage EasyRoads3DProv3v3.2.1f2
2022-07-27
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人