版本4.24.3
1.创建一个Actor
UCLASS()
class MY_API AMyActor : public AActor
{
GENERATED_UCLASS_BODY()
UPROPERTY()
class UMyRenderingComponent * MyRenderingComponent;
};
2.创建一个UPrimitiveComponent 组件,这个组件是游戏线程渲染组件
UCLASS()
class MY_API UMyRenderingComponent : public UPrimitiveComponent
{
GENERATED_BODY()
public:
//~ Begin UActorComponent Interface.
virtual void CreateRenderState_Concurrent() override;
virtual void SendRenderDynamicData_Concurrent() override;
//~ End UActorComponent Interface.
//~ Begin UPrimitiveComponent Interface
virtual FPrimitiveSceneProxy* CreateSceneProxy() override;
//~ End UPrimitiveComponent Interface.
//~ Begin USceneComponent Interface
virtual FBoxSphereBounds CalcBounds(const FTransform& LocalToWorld) const override;
//~ End USceneComponent Interface
};
一定要重写的是CreateSceneProxy函数,因为这是创建FPrimitiveSceneProxy的地方。FPrimitiveSceneProxy是网格体渲染管道的开端,是游戏线程对渲染控制的末端,剩下的渲染都是渲染线程的工作。
CreateRenderState_Concurrent是渲染状态更新会调用的函数,当渲染状态更新需要做操作时可以重载该函数。MarkRenderStateDirty函数表示更新渲染状态。
CreateSceneProxy和CreateRenderState_Concurrent的关系堆栈
从这个堆栈可以看出,CreateScneProxy是UPrimitiveComponent里GetWorld()->Scene->AddPrimitive(this)函数调用的。
SendRenderDynamicData_Concurrent是渲染数据更新会调用的函数,当渲染数据更新需要做操作时可以重载该函数。MarkRenderDynamicDataDirty函数表示更新渲染数据。
3.创建一个FPrimitiveSceneProxy,这是游戏线程的“UPrimitiveComponent”渲染线程表示,通过对“GetDynamicMeshElements”和“DrawStaticEl