虚幻4 渲染一个BOX的过程

来源:互联网 发布:淘宝追加评论怎么写 编辑:程序博客网 时间:2024/06/05 08:15
向场景增加MESH和更新MESH的位置等函数都在
\Engine\Source\Runtime\Renderer\Private\RendererScene.cpp
文件中。

渲染一个BOX首先在主线程通过调用这个函数向渲染线程发送命令,告诉渲染线程增加一个Primitive。
void FScene::AddPrimitive(UPrimitiveComponent* Primitive){SCOPE_CYCLE_COUNTER(STAT_AddScenePrimitiveGT);checkf(!Primitive->IsUnreachable(), TEXT("%s"), *Primitive->GetFullName());// Save the world transform for next time the primitive is added to the scenefloat DeltaTime = GetWorld()->GetTimeSeconds() - Primitive->LastSubmitTime;if ( DeltaTime < -0.0001f || Primitive->LastSubmitTime < 0.0001f ){


渲染线程会调用这个函数,添加信息到渲染线程可以读取的结构中。
void FScene::AddPrimitiveSceneInfo_RenderThread(FRHICommandListImmediate& RHICmdList, FPrimitiveSceneInfo* PrimitiveSceneInfo){SCOPE_CYCLE_COUNTER(STAT_AddScenePrimitiveRenderThreadTime);CheckPrimitiveArrays();int32 PrimitiveIndex = Primitives.Add(PrimitiveSceneInfo);PrimitiveSceneInfo->PackedIndex = PrimitiveIndex;PrimitiveBounds.AddUninitialized();PrimitiveVisibilityIds.AddUninitialize


最后在每一帧的render函数中,读取渲染线程可以读取的数据,遍历场景中可见物品,调用到这里,最后调用到D3D(windows下)的API
\Engine\Source\Runtime\Renderer\Private\DrawingPolicy.cpp
void FMeshDrawingPolicy::DrawMesh(FRHICommandList& RHICmdList, const FMeshBatch& Mesh, int32 BatchElementIndex, const bool bIsInstancedStereo) const{INC_DWORD_STAT(STAT_MeshDrawCalls);SCOPED_CONDITIONAL_DRAW_EVENTF(RHICmdList, MeshEvent, GEmitMeshDrawEvent != 0, TEXT("Mesh Draw"));const FMeshBatchElement& BatchElement = Mesh.Elements[BatchElementIndex];





如果一个mesh位置变化了,也会调用FScene里面的更新函数:
void FScene::UpdatePrimitiveTransform(UPrimitiveComponent* Primitive){SCOPE_CYCLE_COUNTER(STAT_UpdatePrimitiveTransformGT);// Save the world transform for next time the primitive is added to the scenefloat DeltaTime = GetWorld()->GetTimeSeconds() - Primitive->LastSubmitTime;if ( DeltaTime < -0.0001f || Primitive->LastSubmitTime < 0.0001f ){// Time was reset?Primitive->LastSubmitTime = GetWorld()-

和增加MESH一样,更新也会调用一个渲染线程的代码:
void FScene::UpdatePrimitiveTransform_RenderThread(FRHICommandListImmediate& RHICmdList, FPrimitiveSceneProxy* PrimitiveSceneProxy, const FBoxSphereBounds& WorldBounds, const FBoxSphereBounds& LocalBounds, const FMatrix& LocalToWorld, const FVector& OwnerPosition){SCOPE_CYCLE_COUNTER(STAT_UpdatePrimitiveTransformRenderThreadTime);const bool bUpdateStaticDrawLists = !PrimitiveSceneProxy->StaticElementsAlwaysUseProxyPrimitiveUniformBuffer();// Remove the primitive from the scene at its old location// (note that the octree update relies on the bounds not being modified yet).PrimitiveSceneProxy->GetPrimitiveSceneInfo()->RemoveFromScene(bUpdateStaticDrawLists);



虚幻4 主线程一直向渲染线程发送Task
http://blog.csdn.net/lqpgfz/article/details/51136345
渲染线程的Render也是通过主线程一直发送task来执行的。









0 0