vault backup: 2024-02-06 17:24:44
This commit is contained in:
parent
35c941f86f
commit
67a7f200b8
@ -193,4 +193,472 @@ private:
|
||||
// 缓冲区尺寸.
|
||||
uint32 LayoutConstantBufferSize;
|
||||
};
|
||||
```
|
||||
|
||||
// 定义FRHIUniformBuffer的引用类型.
|
||||
typedef TRefCountPtr<FRHIUniformBuffer> FUniformBufferRHIRef;
|
||||
|
||||
// Engine\Source\Runtime\RenderCore\Public\ShaderParameterMacros.h
|
||||
// 引用了指定类型的FRHIUniformBuffer的实例资源. 注意是继承了FUniformBufferRHIRef.
|
||||
template<typename TBufferStruct>
|
||||
class TUniformBufferRef : public FUniformBufferRHIRef
|
||||
{
|
||||
public:
|
||||
TUniformBufferRef();
|
||||
|
||||
// 根据给定的值创建Uniform Buffer, 并返回结构体引用. (模板)
|
||||
static TUniformBufferRef<TBufferStruct> CreateUniformBufferImmediate(const TBufferStruct& Value, EUniformBufferUsage Usage, EUniformBufferValidation Validation = EUniformBufferValidation::ValidateResources);
|
||||
// 根据给定的值创建[局部]的Uniform Buffer, 并返回结构体引用.
|
||||
static FLocalUniformBuffer CreateLocalUniformBuffer(FRHICommandList& RHICmdList, const TBufferStruct& Value, EUniformBufferUsage Usage);
|
||||
|
||||
// 立即刷新缓冲区数据到RHI.
|
||||
void UpdateUniformBufferImmediate(const TBufferStruct& Value);
|
||||
|
||||
private:
|
||||
// 私有构造体, 只能给TUniformBuffer和TRDGUniformBuffer创建.
|
||||
TUniformBufferRef(FRHIUniformBuffer* InRHIRef);
|
||||
|
||||
template<typename TBufferStruct2>
|
||||
friend class TUniformBuffer;
|
||||
|
||||
friend class TRDGUniformBuffer<TBufferStruct>;
|
||||
};
|
||||
```
|
||||
|
||||
最后TUniformBuffer和TRDGUniformBuffer引用了FUniformBufferRHIRef。TUniformBuffer为`TUniformBufferRef<TBufferStruct> UniformBufferRHI`成员变量;TRDGUniformBuffer为`TRefCountPtr<FRHIUniformBuffer> UniformBufferRHI`。
|
||||
|
||||
![[UE_Uniform.png]]
|
||||
|
||||
### 定义宏
|
||||
- SHADER_PARAMETER_STRUCT_REF:引用着色器参数结构体(全局的才行)
|
||||
- SHADER_PARAMETER_STRUCT_INCLUDE:包含着色器参数结构体(局部或全局都行)
|
||||
|
||||
# Vertex Factory
|
||||
我们知道,在引擎中存在着静态网格、蒙皮骨骼、程序化网格以及地形等等类型的网格类型,而材质就是通过顶点工厂FVertexFactory来支持这些网格类型。实际上,顶点工厂要涉及各方面的数据和类型,包含但不限于:
|
||||
- 顶点着色器。顶点着色器的输入输出需要顶点工厂来表明数据的布局。
|
||||
- 顶点工厂的参数和RHI资源。这些数据将从C++层传入到顶点着色器中进行处理。
|
||||
- 顶点缓冲和顶点布局。通过顶点布局,我们可以自定义和扩展顶点缓冲的输入,从而实现定制化的Shader代码。
|
||||
- 几何预处理。顶点缓冲、网格资源、材质参数等等都可以在真正渲染前预处理它们。
|
||||
![[UE_VertexFactory.png]]
|
||||
|
||||
**顶点工厂在渲染层级中的关系。由图可知,顶点工厂是渲染线程的对象,横跨于CPU和GPU两端。**
|
||||
|
||||
```c++
|
||||
// Engine\Source\Runtime\RHI\Public\RHI.h
|
||||
// 顶点元素.
|
||||
struct FVertexElement
|
||||
{
|
||||
uint8 StreamIndex; // 流索引
|
||||
uint8 Offset; // 偏移
|
||||
TEnumAsByte<EVertexElementType> Type; // 类型
|
||||
uint8 AttributeIndex;// 属性索引
|
||||
uint16 Stride; // 步长
|
||||
// 实例索引或顶点索引是否实例化的, 若是0, 则元素会对每个实例进行重复.
|
||||
uint16 bUseInstanceIndex;
|
||||
|
||||
FVertexElement();
|
||||
FVertexElement(uint8 InStreamIndex, ...);
|
||||
|
||||
void operator=(const FVertexElement& Other);
|
||||
friend FArchive& operator<<(FArchive& Ar,FVertexElement& Element);
|
||||
|
||||
FString ToString() const;
|
||||
void FromString(const FString& Src);
|
||||
void FromString(const FStringView& Src);
|
||||
};
|
||||
|
||||
// 顶点声明元素列表的类型.
|
||||
typedef TArray<FVertexElement,TFixedAllocator<MaxVertexElementCount> > FVertexDeclarationElementList;
|
||||
|
||||
// Engine\Source\Runtime\RHI\Public\RHIResources.h
|
||||
// 顶点声明的RHI资源
|
||||
class FRHIVertexDeclaration : public FRHIResource
|
||||
{
|
||||
public:
|
||||
virtual bool GetInitializer(FVertexDeclarationElementList& Init) { return false; }
|
||||
};
|
||||
|
||||
// 顶点缓冲区
|
||||
class FRHIVertexBuffer : public FRHIResource
|
||||
{
|
||||
public:
|
||||
FRHIVertexBuffer(uint32 InSize,uint32 InUsage);
|
||||
|
||||
uint32 GetSize() const;
|
||||
uint32 GetUsage() const;
|
||||
|
||||
protected:
|
||||
FRHIVertexBuffer();
|
||||
|
||||
void Swap(FRHIVertexBuffer& Other);
|
||||
void ReleaseUnderlyingResource();
|
||||
|
||||
private:
|
||||
// 尺寸.
|
||||
uint32 Size;
|
||||
// 缓冲区标记, 如BUF_UnorderedAccess
|
||||
uint32 Usage;
|
||||
};
|
||||
|
||||
// Engine\Source\Runtime\RenderCore\Public\VertexFactory.h
|
||||
// 顶点输入流.
|
||||
struct FVertexInputStream
|
||||
{
|
||||
// 顶点流索引
|
||||
uint32 StreamIndex : 4;
|
||||
// 在VertexBuffer的偏移.
|
||||
uint32 Offset : 28;
|
||||
// 顶点缓存区
|
||||
FRHIVertexBuffer* VertexBuffer;
|
||||
|
||||
FVertexInputStream();
|
||||
FVertexInputStream(uint32 InStreamIndex, uint32 InOffset, FRHIVertexBuffer* InVertexBuffer);
|
||||
|
||||
inline bool operator==(const FVertexInputStream& rhs) const;
|
||||
inline bool operator!=(const FVertexInputStream& rhs) const;
|
||||
};
|
||||
|
||||
// 顶点输入流数组.
|
||||
typedef TArray<FVertexInputStream, TInlineAllocator<4>> FVertexInputStreamArray;
|
||||
|
||||
// 顶点流标记
|
||||
enum class EVertexStreamUsage : uint8
|
||||
{
|
||||
Default = 0 << 0, // 默认
|
||||
Instancing = 1 << 0, // 实例化
|
||||
Overridden = 1 << 1, // 覆盖
|
||||
ManualFetch = 1 << 2 // 手动获取
|
||||
};
|
||||
|
||||
// 顶点输入流类型.
|
||||
enum class EVertexInputStreamType : uint8
|
||||
{
|
||||
Default = 0, // 默认
|
||||
PositionOnly, // 只有位置
|
||||
PositionAndNormalOnly // 只有位置和法线
|
||||
};
|
||||
|
||||
// 顶点流组件.
|
||||
struct FVertexStreamComponent
|
||||
{
|
||||
// 流数据的顶点缓冲区, 如果为null, 则不会有数据从此顶点流被读取.
|
||||
const FVertexBuffer* VertexBuffer = nullptr;
|
||||
|
||||
// vertex buffer的偏移.
|
||||
uint32 StreamOffset = 0;
|
||||
// 数据的偏移, 相对于顶点缓冲区中每个元素的开头.
|
||||
uint8 Offset = 0;
|
||||
// 数据的步长.
|
||||
uint8 Stride = 0;
|
||||
// 从流读取的数据类型.
|
||||
TEnumAsByte<EVertexElementType> Type = VET_None;
|
||||
// 顶点流标记.
|
||||
EVertexStreamUsage VertexStreamUsage = EVertexStreamUsage::Default;
|
||||
|
||||
(......)
|
||||
};
|
||||
|
||||
// 着色器使用的顶点工厂的参数绑定接口.
|
||||
class FVertexFactoryShaderParameters
|
||||
{
|
||||
public:
|
||||
// 绑定参数到ParameterMap. 具体逻辑由子类完成.
|
||||
void Bind(const class FShaderParameterMap& ParameterMap) {}
|
||||
|
||||
// 获取顶点工厂的着色器绑定和顶点流. 具体逻辑由子类完成.
|
||||
void GetElementShaderBindings(
|
||||
const class FSceneInterface* Scene,
|
||||
const class FSceneView* View,
|
||||
const class FMeshMaterialShader* Shader,
|
||||
const EVertexInputStreamType InputStreamType,
|
||||
ERHIFeatureLevel::Type FeatureLevel,
|
||||
const class FVertexFactory* VertexFactory,
|
||||
const struct FMeshBatchElement& BatchElement,
|
||||
class FMeshDrawSingleShaderBindings& ShaderBindings,
|
||||
FVertexInputStreamArray& VertexStreams) const {}
|
||||
|
||||
(......)
|
||||
};
|
||||
|
||||
// 用来表示顶点工厂类型的类.
|
||||
class FVertexFactoryType
|
||||
{
|
||||
public:
|
||||
// 类型定义
|
||||
typedef FVertexFactoryShaderParameters* (*ConstructParametersType)(EShaderFrequency ShaderFrequency, const class FShaderParameterMap& ParameterMap);
|
||||
typedef const FTypeLayoutDesc* (*GetParameterTypeLayoutType)(EShaderFrequency ShaderFrequency);
|
||||
(......)
|
||||
|
||||
// 获取顶点工厂类型数量.
|
||||
static int32 GetNumVertexFactoryTypes();
|
||||
|
||||
// 获取全局的着色器工厂列表.
|
||||
static RENDERCORE_API TLinkedList<FVertexFactoryType*>*& GetTypeList();
|
||||
// 获取已存的材质类型列表.
|
||||
static RENDERCORE_API const TArray<FVertexFactoryType*>& GetSortedMaterialTypes();
|
||||
// 通过名字查找FVertexFactoryType
|
||||
static RENDERCORE_API FVertexFactoryType* GetVFByName(const FHashedName& VFName);
|
||||
|
||||
// 初始化FVertexFactoryType静态成员, 必须在VF类型创建之前调用.
|
||||
static void Initialize(const TMap<FString, TArray<const TCHAR*> >& ShaderFileToUniformBufferVariables);
|
||||
static void Uninitialize();
|
||||
|
||||
// 构造/析构函数.
|
||||
RENDERCORE_API FVertexFactoryType(...);
|
||||
virtual ~FVertexFactoryType();
|
||||
|
||||
// 数据获取接口.
|
||||
const TCHAR* GetName() const;
|
||||
FName GetFName() const;
|
||||
const FHashedName& GetHashedName() const;
|
||||
const TCHAR* GetShaderFilename() const;
|
||||
|
||||
// 着色器参数接口.
|
||||
FVertexFactoryShaderParameters* CreateShaderParameters(...) const;
|
||||
const FTypeLayoutDesc* GetShaderParameterLayout(...) const;
|
||||
void GetShaderParameterElementShaderBindings(...) const;
|
||||
|
||||
// 标记访问.
|
||||
bool IsUsedWithMaterials() const;
|
||||
bool SupportsStaticLighting() const;
|
||||
bool SupportsDynamicLighting() const;
|
||||
bool SupportsPrecisePrevWorldPos() const;
|
||||
bool SupportsPositionOnly() const;
|
||||
bool SupportsCachingMeshDrawCommands() const;
|
||||
bool SupportsPrimitiveIdStream() const;
|
||||
|
||||
// 获取哈希.
|
||||
friend uint32 GetTypeHash(const FVertexFactoryType* Type);
|
||||
// 基于顶点工厂类型的源码和包含计算出来的哈希.
|
||||
const FSHAHash& GetSourceHash(EShaderPlatform ShaderPlatform) const;
|
||||
// 是否需要缓存材质的着色器类型.
|
||||
bool ShouldCache(const FVertexFactoryShaderPermutationParameters& Parameters) const;
|
||||
|
||||
void ModifyCompilationEnvironment(...);
|
||||
void ValidateCompiledResult(EShaderPlatform Platform, ...);
|
||||
|
||||
bool SupportsTessellationShaders() const;
|
||||
|
||||
// 增加引用的Uniform Buffer包含.
|
||||
void AddReferencedUniformBufferIncludes(...);
|
||||
void FlushShaderFileCache(...);
|
||||
const TMap<const TCHAR*, FCachedUniformBufferDeclaration>& GetReferencedUniformBufferStructsCache() const;
|
||||
|
||||
private:
|
||||
static uint32 NumVertexFactories;
|
||||
static bool bInitializedSerializationHistory;
|
||||
|
||||
// 顶点工厂类型的各类数据和标记.
|
||||
const TCHAR* Name;
|
||||
const TCHAR* ShaderFilename;
|
||||
FName TypeName;
|
||||
FHashedName HashedName;
|
||||
uint32 bUsedWithMaterials : 1;
|
||||
uint32 bSupportsStaticLighting : 1;
|
||||
uint32 bSupportsDynamicLighting : 1;
|
||||
uint32 bSupportsPrecisePrevWorldPos : 1;
|
||||
uint32 bSupportsPositionOnly : 1;
|
||||
uint32 bSupportsCachingMeshDrawCommands : 1;
|
||||
uint32 bSupportsPrimitiveIdStream : 1;
|
||||
ConstructParametersType ConstructParameters;
|
||||
GetParameterTypeLayoutType GetParameterTypeLayout;
|
||||
GetParameterTypeElementShaderBindingsType GetParameterTypeElementShaderBindings;
|
||||
ShouldCacheType ShouldCacheRef;
|
||||
ModifyCompilationEnvironmentType ModifyCompilationEnvironmentRef;
|
||||
ValidateCompiledResultType ValidateCompiledResultRef;
|
||||
SupportsTessellationShadersType SupportsTessellationShadersRef;
|
||||
|
||||
// 全局顶点工厂类型列表.
|
||||
TLinkedList<FVertexFactoryType*> GlobalListLink;
|
||||
// 缓存引用的Uniform Buffer的包含.
|
||||
TMap<const TCHAR*, FCachedUniformBufferDeclaration> ReferencedUniformBufferStructsCache;
|
||||
// 跟踪ReferencedUniformBufferStructsCache缓存了哪些平台的声明.
|
||||
bool bCachedUniformBufferStructDeclarations;
|
||||
};
|
||||
|
||||
// ------顶点工厂的工具宏------
|
||||
// 实现顶点工厂参数类型
|
||||
#define IMPLEMENT_VERTEX_FACTORY_PARAMETER_TYPE(FactoryClass, ShaderFrequency, ParameterClass)
|
||||
// 顶点工厂类型的声明
|
||||
#define DECLARE_VERTEX_FACTORY_TYPE(FactoryClass)
|
||||
// 顶点工厂类型的实现
|
||||
#define IMPLEMENT_VERTEX_FACTORY_TYPE(FactoryClass,ShaderFilename,bUsedWithMaterials,bSupportsStaticLighting,bSupportsDynamicLighting,bPrecisePrevWorldPos,bSupportsPositionOnly)
|
||||
// 顶点工厂的虚函数表实现
|
||||
#define IMPLEMENT_VERTEX_FACTORY_VTABLE(FactoryClass
|
||||
|
||||
// 顶点工厂
|
||||
class FVertexFactory : public FRenderResource
|
||||
{
|
||||
public:
|
||||
FVertexFactory(ERHIFeatureLevel::Type InFeatureLevel);
|
||||
|
||||
virtual FVertexFactoryType* GetType() const;
|
||||
|
||||
// 获取顶点数据流.
|
||||
void GetStreams(ERHIFeatureLevel::Type InFeatureLevel, EVertexInputStreamType VertexStreamType, FVertexInputStreamArray& OutVertexStreams) const
|
||||
{
|
||||
// Default顶点流类型
|
||||
if (VertexStreamType == EVertexInputStreamType::Default)
|
||||
{
|
||||
bool bSupportsVertexFetch = SupportsManualVertexFetch(InFeatureLevel);
|
||||
|
||||
// 将顶点工厂的数据构造到FVertexInputStream中并添加到输出列表
|
||||
for (int32 StreamIndex = 0;StreamIndex < Streams.Num();StreamIndex++)
|
||||
{
|
||||
const FVertexStream& Stream = Streams[StreamIndex];
|
||||
|
||||
if (!(EnumHasAnyFlags(EVertexStreamUsage::ManualFetch, Stream.VertexStreamUsage) && bSupportsVertexFetch))
|
||||
{
|
||||
if (!Stream.VertexBuffer)
|
||||
{
|
||||
OutVertexStreams.Add(FVertexInputStream(StreamIndex, 0, nullptr));
|
||||
}
|
||||
else
|
||||
{
|
||||
if (EnumHasAnyFlags(EVertexStreamUsage::Overridden, Stream.VertexStreamUsage) && !Stream.VertexBuffer->IsInitialized())
|
||||
{
|
||||
OutVertexStreams.Add(FVertexInputStream(StreamIndex, 0, nullptr));
|
||||
}
|
||||
else
|
||||
{
|
||||
OutVertexStreams.Add(FVertexInputStream(StreamIndex, Stream.Offset, Stream.VertexBuffer->VertexBufferRHI));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// 只有位置和的顶点流类型
|
||||
else if (VertexStreamType == EVertexInputStreamType::PositionOnly)
|
||||
{
|
||||
// Set the predefined vertex streams.
|
||||
for (int32 StreamIndex = 0; StreamIndex < PositionStream.Num(); StreamIndex++)
|
||||
{
|
||||
const FVertexStream& Stream = PositionStream[StreamIndex];
|
||||
OutVertexStreams.Add(FVertexInputStream(StreamIndex, Stream.Offset, Stream.VertexBuffer->VertexBufferRHI));
|
||||
}
|
||||
}
|
||||
// 只有位置和法线的顶点流类型
|
||||
else if (VertexStreamType == EVertexInputStreamType::PositionAndNormalOnly)
|
||||
{
|
||||
// Set the predefined vertex streams.
|
||||
for (int32 StreamIndex = 0; StreamIndex < PositionAndNormalStream.Num(); StreamIndex++)
|
||||
{
|
||||
const FVertexStream& Stream = PositionAndNormalStream[StreamIndex];
|
||||
OutVertexStreams.Add(FVertexInputStream(StreamIndex, Stream.Offset, Stream.VertexBuffer->VertexBufferRHI));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// NOT_IMPLEMENTED
|
||||
}
|
||||
}
|
||||
|
||||
// 偏移实例的数据流.
|
||||
void OffsetInstanceStreams(uint32 InstanceOffset, EVertexInputStreamType VertexStreamType, FVertexInputStreamArray& VertexStreams) const;
|
||||
|
||||
static void ModifyCompilationEnvironment(...);
|
||||
static void ValidateCompiledResult(...);
|
||||
|
||||
static bool SupportsTessellationShaders();
|
||||
|
||||
// FRenderResource接口, 释放RHI资源.
|
||||
virtual void ReleaseRHI();
|
||||
|
||||
// 设置/获取顶点声明的RHI引用.
|
||||
FVertexDeclarationRHIRef& GetDeclaration();
|
||||
void SetDeclaration(FVertexDeclarationRHIRef& NewDeclaration);
|
||||
|
||||
// 根据类型获取顶点声明的RHI引用.
|
||||
const FVertexDeclarationRHIRef& GetDeclaration(EVertexInputStreamType InputStreamType) const
|
||||
{
|
||||
switch (InputStreamType)
|
||||
{
|
||||
case EVertexInputStreamType::Default: return Declaration;
|
||||
case EVertexInputStreamType::PositionOnly: return PositionDeclaration;
|
||||
case EVertexInputStreamType::PositionAndNormalOnly: return PositionAndNormalDeclaration;
|
||||
}
|
||||
return Declaration;
|
||||
}
|
||||
|
||||
// 各类标记.
|
||||
virtual bool IsGPUSkinned() const;
|
||||
virtual bool SupportsPositionOnlyStream() const;
|
||||
virtual bool SupportsPositionAndNormalOnlyStream() const;
|
||||
virtual bool SupportsNullPixelShader() const;
|
||||
|
||||
// 用面向摄像机精灵的方式渲染图元.
|
||||
virtual bool RendersPrimitivesAsCameraFacingSprites() const;
|
||||
|
||||
// 是否需要顶点声明.
|
||||
bool NeedsDeclaration() const;
|
||||
// 是否支持手动的顶点获取.
|
||||
inline bool SupportsManualVertexFetch(const FStaticFeatureLevel InFeatureLevel) const;
|
||||
// 根据流类型获取索引.
|
||||
inline int32 GetPrimitiveIdStreamIndex(EVertexInputStreamType InputStreamType) const;
|
||||
|
||||
protected:
|
||||
inline void SetPrimitiveIdStreamIndex(EVertexInputStreamType InputStreamType, int32 StreamIndex)
|
||||
{
|
||||
PrimitiveIdStreamIndex[static_cast<uint8>(InputStreamType)] = StreamIndex;
|
||||
}
|
||||
|
||||
// 为顶点流组件创建顶点元素.
|
||||
FVertexElement AccessStreamComponent(const FVertexStreamComponent& Component,uint8 AttributeIndex);
|
||||
FVertexElement AccessStreamComponent(const FVertexStreamComponent& Component, uint8 AttributeIndex, EVertexInputStreamType InputStreamType);
|
||||
// 初始化顶点声明.
|
||||
void InitDeclaration(const FVertexDeclarationElementList& Elements, EVertexInputStreamType StreamType = EVertexInputStreamType::Default)
|
||||
{
|
||||
if (StreamType == EVertexInputStreamType::PositionOnly)
|
||||
{
|
||||
PositionDeclaration = PipelineStateCache::GetOrCreateVertexDeclaration(Elements);
|
||||
}
|
||||
else if (StreamType == EVertexInputStreamType::PositionAndNormalOnly)
|
||||
{
|
||||
PositionAndNormalDeclaration = PipelineStateCache::GetOrCreateVertexDeclaration(Elements);
|
||||
}
|
||||
else // (StreamType == EVertexInputStreamType::Default)
|
||||
{
|
||||
// Create the vertex declaration for rendering the factory normally.
|
||||
Declaration = PipelineStateCache::GetOrCreateVertexDeclaration(Elements);
|
||||
}
|
||||
}
|
||||
|
||||
// 顶点流, 需要设置到顶点流的信息体.
|
||||
struct FVertexStream
|
||||
{
|
||||
const FVertexBuffer* VertexBuffer = nullptr;
|
||||
uint32 Offset = 0;
|
||||
uint16 Stride = 0;
|
||||
EVertexStreamUsage VertexStreamUsage = EVertexStreamUsage::Default;
|
||||
uint8 Padding = 0;
|
||||
|
||||
friend bool operator==(const FVertexStream& A,const FVertexStream& B);
|
||||
FVertexStream();
|
||||
};
|
||||
|
||||
// 用于渲染顶点工厂的顶点流.
|
||||
TArray<FVertexStream,TInlineAllocator<8> > Streams;
|
||||
|
||||
// VF(顶点工厂)可以显式地将此设置为false,以避免在没有声明的情况下出现错误. 主要用于需要直接从缓冲区获取数据的VF(如Niagara).
|
||||
bool bNeedsDeclaration = true;
|
||||
bool bSupportsManualVertexFetch = false;
|
||||
int8 PrimitiveIdStreamIndex[3] = { -1, -1, -1 };
|
||||
|
||||
private:
|
||||
// 只有位置的顶点流, 用于渲染深度Pass的顶点工厂.
|
||||
TArray<FVertexStream,TInlineAllocator<2> > PositionStream;
|
||||
// 只有位置和法线的顶点流.
|
||||
TArray<FVertexStream, TInlineAllocator<3> > PositionAndNormalStream;
|
||||
|
||||
// 用于常规渲染顶点工厂的RHI顶点声明.
|
||||
FVertexDeclarationRHIRef Declaration;
|
||||
|
||||
// PositionStream和PositionAndNormalStream对应的RHI资源.
|
||||
FVertexDeclarationRHIRef PositionDeclaration;
|
||||
FVertexDeclarationRHIRef PositionAndNormalDeclaration;
|
||||
};
|
||||
```
|
||||
|
||||
上面展示了Vertex Factory的很多类型,有好几个是核心类,比如FVertexFactory、FVertexElement、FRHIVertexDeclaration、FRHIVertexBuffer、FVertexFactoryType、FVertexStreamComponent、FVertexInputStream、FVertexFactoryShaderParameters等。那么它们之间的关系是什么呢?
|
||||
|
||||
为了更好地说明它们之间的关系,以静态模型的FStaticMeshDataType为例:
|
||||
![[UE_VertexFactory_FStaticMeshDataType.jpg]]
|
BIN
08-Assets/Images/ImageBag/Images/UE_Uniform.png
Normal file
BIN
08-Assets/Images/ImageBag/Images/UE_Uniform.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 74 KiB |
BIN
08-Assets/Images/ImageBag/Images/UE_VertexFactory.png
Normal file
BIN
08-Assets/Images/ImageBag/Images/UE_VertexFactory.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 17 KiB |
Binary file not shown.
After Width: | Height: | Size: 79 KiB |
Loading…
x
Reference in New Issue
Block a user