From 35c941f86fb279395160f88f7bf828f39de02ba4 Mon Sep 17 00:00:00 2001 From: BlueRose <378100977@qq.com> Date: Tue, 6 Feb 2024 13:07:47 +0800 Subject: [PATCH] vault backup: 2024-02-06 13:07:47 --- .../剖析虚幻渲染体系(08)- Shader体系.md | 55 +++++++++++++++---- 1 file changed, 44 insertions(+), 11 deletions(-) diff --git a/03-UnrealEngine/Rendering/RenderingPipeline/向往渲染系列文章阅读笔记/剖析虚幻渲染体系(08)- Shader体系.md b/03-UnrealEngine/Rendering/RenderingPipeline/向往渲染系列文章阅读笔记/剖析虚幻渲染体系(08)- Shader体系.md index aa387b9..a0a255e 100644 --- a/03-UnrealEngine/Rendering/RenderingPipeline/向往渲染系列文章阅读笔记/剖析虚幻渲染体系(08)- Shader体系.md +++ b/03-UnrealEngine/Rendering/RenderingPipeline/向往渲染系列文章阅读笔记/剖析虚幻渲染体系(08)- Shader体系.md @@ -141,23 +141,56 @@ private: LAYOUT_FIELD(TIndexedPtr, Type); // 顶点工厂类型. LAYOUT_FIELD(TIndexedPtr, VFType); - - /** Target platform and frequency. */ + // 目标平台和着色频率(frequency). LAYOUT_FIELD(FShaderTarget, Target); - - /** Index of this shader within the FShaderMapResource */ + // 在FShaderMapResource的shader索引. LAYOUT_FIELD(int32, ResourceIndex); - - /** The number of instructions the shader takes to execute. */ + // shader指令数. LAYOUT_FIELD(uint32, NumInstructions); - /** Truncated version of OutputHash, intended for sorting. Not suitable for unique shader identification. */ LAYOUT_FIELD(uint32, SortKey); - - /** Number of texture samplers the shader uses. */ + // 纹理采样器数量. LAYOUT_FIELD_EDITORONLY(uint32, NumTextureSamplers); - - /** Size of shader's compiled code */ + // shader代码尺寸. LAYOUT_FIELD_EDITORONLY(uint32, CodeSize); }; +``` +以上可知,FShader存储着Shader关联的绑定参数、顶点工厂、编译后的各类资源等数据,并提供了编译器修改和检测接口,还有各类数据获取接口。 + +FShader实际上是个基础父类,它的子类有: +- **FGlobalShader**:全局着色器,它的子类在内存中只有唯一的实例,常用于屏幕方块绘制、后处理等。相比父类FShader,增加了SetParameters设置视图统一缓冲的接口。FGlobalShader包含了后处理、光照、工具类、可视化、地形、虚拟纹理等方面的Shader代码,可以是VS、PS、CS,但CS必然是FGlobalShader的子类 +- **FMaterialShader**:材质着色器,由FMaterialShaderType指定的材质引用的着色器,是材质蓝图在实例化后的一个shader子集。FMaterialShader主要包含了模型、专用Pass、体素化等方面的Shader代码,可以是VS、PS、GS等,但不会有CS。 + +## Shader Parameter +位于`Engine\Source\Runtime\RenderCore\Public\ShaderParameters.h`。 +- FShaderParameter:着色器的寄存器绑定参数, 它的类型可以是float1/2/3/4,数组等。 +- FShaderResourceParameter:着色器资源绑定(纹理或采样器)。 +- FRWShaderParameter:绑定了UAV或SRV资源的类型。 +- FShaderUniformBufferParameter:着色器统一缓冲参数。 + +## Uniform Buffer +位于`Engine\Source\Runtime\RHI\Public\RHIResources.h`。 +UE的Uniform Buffer涉及了几个核心的概念,最底层的是RHI层的FRHIUniformBuffer,封装了各种图形API的统一缓冲区(也叫Constant Buffer)。 +```c++ +class FRHIUniformBuffer : public FRHIResource +{ +public: + // 构造函数. + FRHIUniformBuffer(const FRHIUniformBufferLayout& InLayout); + + // 引用计数操作. + uint32 AddRef() const; + uint32 Release() const; + + // 数据获取接口. + uint32 GetSize() const; + const FRHIUniformBufferLayout& GetLayout() const; + bool IsGlobal() const; + +private: + // RHI Uniform Buffer的布局. + const FRHIUniformBufferLayout* Layout; + // 缓冲区尺寸. + uint32 LayoutConstantBufferSize; +}; ``` \ No newline at end of file