虚幻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
- 虚幻4 渲染一个BOX的过程
- 虚幻4 D3D渲染过程的笔记
- 虚幻4 渲染staticmesh过程。
- 虚幻4:有关渲染宏的解释。
- 虚幻4 删除Actor渲染线程和主线程的过程
- 虚幻4 渲染前剔除
- 虚幻4:有关渲染宏的解释2
- 虚幻4:有关渲染宏的解释3
- 虚幻4 主线程与渲染线程的同步。
- 虚幻4 添加变量控制UI的渲染,详细教程。
- 虚幻4 渲染模块在哪里
- 虚幻4 渲染线程主循环
- 虚幻4渲染系统结构解析
- 虚幻4渲染系统结构解析
- 虚幻4 渲染探索【1】引擎渲染组件初探
- 虚幻4 材质的编译2 真正的编译过程
- 我的虚幻4之旅02 添加一个ACharacter
- 虚幻4的Style
- Spring-boot 文件上传
- 导出,打印和保存本地日志文件 - 打印
- 百度软件测试工程师笔试和面试完整经历
- Filter Manager and Minifilter Driver Architecture
- 判断当前ImageView设置的是哪张图片
- 虚幻4 渲染一个BOX的过程
- iconfont字体图标的使用
- 11g 单机 asm
- 深度解析CyclicBarrier源码
- Caffe学习笔记(一):Caffe架构及其模型解析
- 设置Eclipse的类文件和xml文件代码自动补全
- 移动端页面防止左右滑动出现黑色背景
- android 适配工具
- IDEA 初始配置教程