vault backup: 2024-02-06 13:07:47

This commit is contained in:
BlueRose 2024-02-06 13:07:47 +08:00
parent bd415a90d1
commit 35c941f86f

View File

@ -141,23 +141,56 @@ private:
LAYOUT_FIELD(TIndexedPtr<FShaderType>, Type);
// 顶点工厂类型.
LAYOUT_FIELD(TIndexedPtr<FVertexFactoryType>, 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;
};
```