@author:白袍小道

随缘查看

前言:

绘制相关类

MeshCompoent

模型组件

FVertexBuffer

顶点缓冲区封装

FIndexBuffer

顶点索引缓冲区封装

FRHIResourceCreateInfo

资源创建描述,分装了底层(DX,OPENGL)的资源(如缓冲区)的描述

FMemory

C++内存操作封装

RHIUnlockIndexBuffer

????????

FPrimitiveSceneProxy

为渲染线程映射 UPrimitiveComponent 状态。

划分为子类以支持不同类型的基元(骨架、刚体、BSP 等)

实现某些非常重要的函数.

FSceneView

单个视图到一个 FScene 的引擎代表。

通过对 FSceneRenderer::Render 的不同调用不同视图来渲染(多编辑器视口)

通过对 FSceneRenderer::Render 的同一调用中的多个视图来渲染(分屏游戏)。

为每个帧构建新视图

FSceneViewFamily

一组视图进入一个场景,该场景有不同的视图转换和所有者角色,所以有个管理(维护)

FMeshElementCollector

FDynamicMeshBuilder

绘制规则

  • Constructor : 从给定的顶点工厂(vertex factory)和材质着色器列表(material shader map)找出适当的着色器,并存储他们的引用。

    其中材质着色器可以看GlobalShader的管理部分【值得参考类比和学习】。

  • CreateBoundShaderState : 为绘制规则(Drawing Policy)创建绑定到RHI的着色器状态。
  • Matches/Compare : 提供了排序该drawing policy和渲染列表(draw lists)中其他drawing policy的函数,Matches 必须比较 DrawShared 依赖的所有因素。
  • DrawShared : 设置在从 Matches 返回 True 的绘制规则之间一致的 RHI 状态。例如,大多数绘制规则会为材质和顶点工厂排序,因此着色器参数只依赖可以设置的材质,并且可以绑定特定于该顶点工厂的顶点缓冲区。应尽可能在此处设置状态,而非在 SetMeshRenderState 设置,因为 DrawShared 在静态渲染路径中调用较少。
  • SetMeshRenderState : 设置特定于此网格体的 RHI 状态,或 DrawShared 中未设置的状态。这比 DrawShared 调用的次数多得多,因此此处性能非常重要。
  • DrawMesh : 实际发出 RHI 绘制调用

参考源码及其说明

DZCPP_CustomMeshComponent_01.h


// Fill out your copyright notice in the Description page of Project Settings.

#pragma once

#include "CoreMinimal.h"
#include "Components/MeshComponent.h"
#include <VertexFactory.h>
#include "ContentExamples.h"
#include "DynamicMeshBuilder.h"
#include "DZCPP_CustomMeshComponent_01.generated.h"

/**
*
*/
UCLASS(ClassGroup=Experimental,meta = (BlueprintSpawnableComponent))
class CONTENTEXAMPLES_API UDZCPP_CustomMeshComponent_01 : public UMeshComponent
{
GENERATED_BODY()
public:
virtual FPrimitiveSceneProxy * CreateSceneProxy() override;
TArray<int32> Indices;
TArray<FVector> Vertices;

UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Materials)
UMaterial * TheMaterial;

UDZCPP_CustomMeshComponent_01();
};

DZCPP_CustomMeshComponent_01.cpp


// Fill out your copyright notice in the Description page of Project Settings.
#include "DZCPP_CustomMeshComponent_01.h"
class FMyVertexBuffer : public FVertexBuffer
{
public:
TArray<FVector> Vertices;
virtual void InitRHI() override
{
FRHIResourceCreateInfo CreateInfo;
VertexBufferRHI = RHICreateVertexBuffer(Vertices.Num()
* sizeof(FVector), BUF_Static, CreateInfo);
void* VertexBufferData =
RHILockVertexBuffer(VertexBufferRHI, 0, Vertices.Num()
* sizeof(FVector), RLM_WriteOnly);
FMemory::Memcpy(VertexBufferData, Vertices.GetData(),
Vertices.Num() * sizeof(FVector));
RHIUnlockVertexBuffer(VertexBufferRHI);
}
};
class FMyIndexBuffer : public FIndexBuffer
{
public:
TArray<int32> Indices;
virtual void InitRHI() override
{
FRHIResourceCreateInfo CreateInfo;
IndexBufferRHI = RHICreateIndexBuffer(sizeof(int32),
Indices.Num() * sizeof(int32), BUF_Static, CreateInfo);
void* Buffer = RHILockIndexBuffer(IndexBufferRHI, 0,
Indices.Num() * sizeof(int32), RLM_WriteOnly);
FMemory::Memcpy(Buffer, Indices.GetData(),
Indices.Num() * sizeof(int32));
RHIUnlockIndexBuffer(IndexBufferRHI);
}
};

class FMySceneProxy : public FPrimitiveSceneProxy
{
private:
TArray<FDynamicMeshVertex> Vertices;
TArray<int32> Indices;
FMyVertexBuffer VertexBuffer;
FMyIndexBuffer IndexBuffer;
public:
UPROPERTY()
UMaterial* TheMaterial;
FMySceneProxy(UDZCPP_CustomMeshComponent_01* Component) :FPrimitiveSceneProxy(Component), Indices(Component->Indices), TheMaterial(Component->TheMaterial)
{
// VertexBuffer = FMyVertexBuffer();
// IndexBuffer = FMyIndexBuffer();
// for (FVector Vertex : Component->Vertices)
// {
// Vertices.Add(FDynamicMeshVertex(Component
// ->GetComponentLocation() + Vertex));
// }
}
//FPrimitiveViewRelevance GetViewRelevance(const FSceneView* View)
//{
// FPrimitiveViewRelevance Result;
// Result.bDynamicRelevance = true;
// Result.bDrawRelevance = true;
// Result.bNormalTranslucencyRelevance = true;
// return Result;
//}

//void GetDynamicMeshElements(const TArray<const
// FSceneView*>& Views, const FSceneViewFamily& ViewFamily,
// uint32 VisibilityMap, FMeshElementCollector& Collector)
//{
// for (int32 ViewIndex = 0; ViewIndex < Views.Num();
// ViewIndex++)
// {
// FDynamicMeshBuilder MeshBuilder;
// if (Vertices.Num() == 0)
// {
// return;
// }
// MeshBuilder.AddVertices(Vertices);
// MeshBuilder.AddTriangles(Indices);
// }
//}

//void FMySceneProxy::OnActorPositionChanged()
//{
// VertexBuffer.ReleaseResource();
// IndexBuffer.ReleaseResource();
//}

//uint32 FMySceneProxy::GetMemoryFootprint(void)
//{
// return sizeof(*this);
//}
virtual ~FMySceneProxy() {};
};

FPrimitiveSceneProxy* UDZCPP_CustomMeshComponent_01::CreateSceneProxy()
{
FPrimitiveSceneProxy* proxy = nullptr;
//fmysceneproxy * childproxy = new fmysceneproxy(this);
//proxy = childproxy;
return proxy;
}

UDZCPP_CustomMeshComponent_01::UDZCPP_CustomMeshComponent_01()
{
/*static ConstructorHelpers::FObjectFinder<UMaterial>Material(TEXT("Material'/Engine/BasicShapes/BasicShapeMaterial'"));
if (Material.Object != NULL)
{
TheMaterial = (UMaterial*)Material.Object;
}
Vertices.Add(FVector(10, 0, 0));
Vertices.Add(FVector(0, 10, 0));
Vertices.Add(FVector(0, 0, 10));
Indices.Add(0);
Indices.Add(1);
Indices.Add(2);*/
}

(原) Unreal创建自定义MeshCompoent的更多相关文章

  1. [转]maven创建自定义的archetype

    创建自己的archetype一般有两种方式,比较简单的就是create from project 1.首先使用eclipse创建一个新的maven project,然后把配置好的一些公用的东西放到相应 ...

  2. ASP.NET MVC随想录——创建自定义的Middleware中间件

    经过前2篇文章的介绍,相信大家已经对OWIN和Katana有了基本的了解,那么这篇文章我将继续OWIN和Katana之旅——创建自定义的Middleware中间件. 何为Middleware中间件 M ...

  3. 带你走近AngularJS - 创建自定义指令

    带你走近AngularJS系列: 带你走近AngularJS - 基本功能介绍 带你走近AngularJS - 体验指令实例 带你走近AngularJS - 创建自定义指令 ------------- ...

  4. ArcGIS Engine环境下创建自定义的ArcToolbox Geoprocessing工具

    在上一篇日志中介绍了自己通过几何的方法合并断开的线要素的ArcGIS插件式的应用程序.但是后来考虑到插件式的程序的配置和使用比较繁琐,也没有比较好的错误处理机制,于是我就把之前的程序封装成一个类似于A ...

  5. Dockerfile创建自定义Docker镜像以及CMD与ENTRYPOINT指令的比较

    1.概述 创建Docker镜像的方式有三种 docker commit命令:由容器生成镜像: Dockerfile文件+docker build命令: 从本地文件系统导入:OpenVZ的模板. 关于这 ...

  6. .NET微信公众号开发-2.0创建自定义菜单

    一.前言 开发之前,我们需要阅读官方的接口说明文档,不得不吐槽一下,微信的这个官方文档真的很烂,但是,为了开发我们需要的功能,我们也不得不去看这些文档. 接口文档地址:http://mp.weixin ...

  7. HTML5 UI框架Kendo UI Web教程:创建自定义组件(三)

    Kendo UI Web包 含数百个创建HTML5 web app的必备元素,包括UI组件.数据源.验证.一个MVVM框架.主题.模板等.在前面的2篇文章<HTML5 Web app开发工具Ke ...

  8. HTML5 UI框架Kendo UI Web中如何创建自定义组件(二)

    在前面的文章<HTML5 UI框架Kendo UI Web自定义组件(一)>中,对在Kendo UI Web中如何创建自定义组件作出了一些基础讲解,下面将继续前面的内容. 使用一个数据源 ...

  9. IconVault – 创建自定义图标字体的神器推荐

    图标字体简单来说就是外观呈现为图标的字体,同时具有矢量图形的特征,在不同的设备上使用图标的时候就不用加载不同尺寸的图片文件,能够减少 HTTP 请求数,提高页面加载速度. IconVault 这款在线 ...

随机推荐

  1. 【CCPC-Wannafly Winter Camp Day3 (Div1) G】排列(水题)

    点此看题面 大致题意:已知 \(p\)为\(n\)的一个排列,定义\(A(p)_i=min_{j=1}^ip_j\),若用\(q_i\)表示\(p\)第\(i\)小的前缀的长度(以值为第一关键字,下标 ...

  2. MySQL中的if和case语句使用总结

    create table test( id int primary key auto_increment, name ), sex int ) ),(),(),() ,'男','女') from te ...

  3. 旧文备份:VC中嵌入NASM编写的汇编函数

    在公司开发的RT下没法使用C库,并且替代库函数没有几个,需要用到setjmp和longjmp函数,没办法,只能自己想办法了,上sourceforge淘换到一个小日本的工程,提供这两个函数的替代源码,名 ...

  4. 第25章 串行FLASH文件系统FatFs—零死角玩转STM32-F429系列

    第25章     串行FLASH文件系统FatFs 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.c ...

  5. python中的反斜杠问题

    python本身使用 \ 来转义一些特殊字符,比如在字符串中加入引号的时候 s = 'i\'m superman' print(s) # i'm superman 为了防止和字符串本身的引号冲突,使用 ...

  6. RHEL7.X安装12.2RAC时root.sh错误CLSRSC-400的解决方案

    问题现象: [root@ora12c ghome]# /opt/oracle/ghome/root.sh Performing root user operation. The following e ...

  7. iOS App 瘦身方案

    缩减iOS安装包大小是很多中大型APP都要做的事,一般首先会对资源文件下手,压缩图片/音频,去除不必要的资源.这些资源优化做完后,我们还可以尝试对可执行文件进行瘦身,项目越大,可执行文件占用的体积越大 ...

  8. Java分享笔记:泛型机制的程序演示

    package packA; import java.util.*; public class GenericDemo { public static void main(String[] args) ...

  9. ABAP Table Control

    SAP中,Table Control是在Screen中用的最广泛的控件之一了,可以实现对多行数据的编辑.  简单来说,Table Control是一组屏幕元素在Screen上的重复出现,这就是它与普通 ...

  10. Django 入门案例开发

    Django是一个重量级的web开发框架,它提供了很多内部已开发好的插件供我们使用:这里不去描述 Django直接进入开发过程. Django入门案例分两部分:一.开发环境的配置:二.业务需求分析. ...