2019-05-11 19:28:25 qq_33465047 阅读数 762
  • 从这里开始虚幻4-Editor介绍 v4.18

    本课程系列取名英译系列,是录制人员参考国外英文原版经典教程,结合中国人的习惯录制而成。希望能够给大家以帮助。从这里开始虚幻4系列教程,是Unreal的官方发布的入门教学,非常经典,是学习Unreal的佳入口。

    2510 人正在学习 去看看 杨石兴

首先建立一个简单的玻璃材质

创建金属材质

 

 效果如左图,上面连接图中的texture sample 

的实现有好几种方法。这里介绍最简单的方法:

 

如下图所示:找到官方提供的贴图。直接托到擦材质编辑器中。

 

 

 

 

 

 

 

 

 

 

 

创建材质实例(创建材质实例是为了省去创建相似材质而设立的,它运用了编程语言中的继承思想,即父子和儿子,之间既有相似也有不同的)

 

第一步:建立的材质,右击,选择创建材质实例。并命名

双击如下图所示:细节面板中并没有可调的参数,

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 第二步:打开最开始创建的材质编辑器,操作如下图:并命名为Color。保存后,再打开创建的材质实例,会看见命名的color,就可以设置参数了,

 

同理,将原材质中的节点,设置后,最终的结果如图:

 

2018-10-13 02:40:00 u012614151 阅读数 5
  • 从这里开始虚幻4-Editor介绍 v4.18

    本课程系列取名英译系列,是录制人员参考国外英文原版经典教程,结合中国人的习惯录制而成。希望能够给大家以帮助。从这里开始虚幻4系列教程,是Unreal的官方发布的入门教学,非常经典,是学习Unreal的佳入口。

    2510 人正在学习 去看看 杨石兴

@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);*/
}

 

2016-04-09 23:25:48 themagickeyjianan 阅读数 452
  • 从这里开始虚幻4-Editor介绍 v4.18

    本课程系列取名英译系列,是录制人员参考国外英文原版经典教程,结合中国人的习惯录制而成。希望能够给大家以帮助。从这里开始虚幻4系列教程,是Unreal的官方发布的入门教学,非常经典,是学习Unreal的佳入口。

    2510 人正在学习 去看看 杨石兴
下载好unreal engine 4后,开始创建项目,默认项目名称是“我的项目”,是个中文名字,这样编译就会出错!不能用默认的名字。
2017-12-07 15:40:09 WAN_EXE 阅读数 437
  • 从这里开始虚幻4-Editor介绍 v4.18

    本课程系列取名英译系列,是录制人员参考国外英文原版经典教程,结合中国人的习惯录制而成。希望能够给大家以帮助。从这里开始虚幻4系列教程,是Unreal的官方发布的入门教学,非常经典,是学习Unreal的佳入口。

    2510 人正在学习 去看看 杨石兴

GUI的重要性。

这章中我们建立player的健康值, stamina, and ammo.展示很多其它的东西。

使用的编辑工具叫做Unreal Motion Graphics UI Designer (UMG).

主要讲述内容:

1. 使用UMG创建UI元素

2. 使用蓝图修改创建的UI元素。

HUD (short for Heads-up Display)

首先进入蓝图定义这些值,定义一个PlayerHealth ,修改它的变量为Float.

做成的一个gui图,界面看上去还行。


有Health, 剩余子弹数,等等其余的值。

主要就是拖拽物体,有点像Android Studio,用过这个的人应该对这个不难。

然后就是连接蓝图,选择相应的事件,下一步是怎么使这些变量生效。

制作的界面

使用的蓝图。



2. Creating binding for health and stamina

有个很关键的词是捆绑,每个widget可能都有一些捆绑的函数。

下面是health progress bar的捆绑, 另外一个和这个相同。

Designer ----> Graph随意切换。


之前在Blueprint命名的四个变量绑定完成,

下面是蓝图

通过下面这个蓝图连接上我们之前定义的UI界面。


通过在Event BeginPlay那里把这个HUD widget加上。

这个模板还是挺复杂的,不过已经完美解决了。



2018-07-10 15:37:36 zsyddl2 阅读数 867
  • 从这里开始虚幻4-Editor介绍 v4.18

    本课程系列取名英译系列,是录制人员参考国外英文原版经典教程,结合中国人的习惯录制而成。希望能够给大家以帮助。从这里开始虚幻4系列教程,是Unreal的官方发布的入门教学,非常经典,是学习Unreal的佳入口。

    2510 人正在学习 去看看 杨石兴

1/

  USceneComponent *pRootComponent = CreateDefaultSubobject<USceneComponent>(name/*TEXT("RootComponent")*/);

    RootComponent = pRootComponent;

这个方式创建 Component 只能在 actor的无参数构造函数中.

之后也可以在此构造函数中创建其他的组件

pProcMeshComponent = CreateDefaultSubobject<UProceduralMeshComponent>(name/*TEXT("RootComponent")*/); //new UProceduralMeshComponent();

pProcMeshComponent->AttachTo(RootComponent);

   2/如果程序想动态创建component就不能这样使用了.

  需要在其他函数中如此调用:

         UProceduralMeshComponent* pProcMeshComponent;//
 
    pProcMeshComponent = NewObject<UProceduralMeshComponent>(this, name, RF_NoFlags, nullptr, false, nullptr);
    if (RootComponent == nullptr)
    {
        FName nameRoot(TEXT("RootComponent"));
        USceneComponent *pRootComponent = NewObject<USceneComponent>(this, nameRoot, RF_NoFlags, nullptr, false, nullptr);
        //RootComponent = pRootComponent;
        //首先注册.否则后面的 attachto 会不显示
        SetRootComponent(pRootComponent);
        RegisterAllComponents();
    }
    //else
    {
        //AddInstanceComponent(pProcMeshComponent);
        pProcMeshComponent->AttachTo(RootComponent);
        
    }
    //每天加一个 都需要重新注册.
    RegisterAllComponents();

unreal4 源码引言

阅读数 266

没有更多推荐了,返回首页