2018-06-15 22:23:38 zsyddl2 阅读数 534
  • 从这里开始虚幻4-Editor介绍 v4.18

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

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

  unreal 默认是 无法嵌入到程序中作为一个dll模块的。想嵌入,需要做一些修改调整。再上一篇文章说过这个主要修改步骤。

这里说第一方面: 

   unreal 导出 dll工程:

   1、通过ue editor 建立一个 ue工程。(UeSdk)

   2、调用vs 打开项目, 修改编译选项。 UeSdk.target.cs 文件 :

        public uesdkTarget(TargetInfo Target) : base(Target)
    {
        Type = TargetType.Game;

        ExtraModuleNames.AddRange( new string[] { "uesdk" } );

        bShouldCompileAsDLL = true;
        bUseStaticCRT = false;

    }

   这样可以编译目标为 dll。但是ue 这里是有问题的。这里虽然生成的目标是dll, 但是 实际是exe文件,只是名称变了。

   这里需要修改 unreal 的编译工具: UnrealBuildTool 

3、修改 UnrealBuildTool工程内容。这里不得不修改源码了。unreal 从软件工程上说,有不少问题。

   UEBuildModuleCpp.cs 1157:

            //CompileEnvironment.bIsBuildingDLL = !Target.ShouldCompileMonolithic();

            CompileEnvironment.bIsBuildingDLL = Target.Rules.bShouldCompileAsDLL ;


UeBuildTarget.cs 3893:

    //zsyddl dll
                    UEBuildBinaryType binaryType = Rules.bShouldCompileAsDLL ? UEBuildBinaryType.DynamicLinkLibrary : UEBuildBinaryType.Executable;
                    //UEBuildBinaryType binaryType = !ShouldCompileMonolithic() ? UEBuildBinaryType.DynamicLinkLibrary : UEBuildBinaryType.Executable;
    这样可以编译为真正的dll

   4、如此修改虽然可以编译为 dll 也可以被调用。但是都是一个独立的 dll,很大的哦。50M+ ;


  以上只是能编译为 dll,并链接了 Unreal主要的库。 想要从程序调用dll,还需要一些修改。

  比如启动 unreal 、 启动 unreal 循环、嵌入到我们的程序窗口重、支持多实例。 后面会将修改好的代码方一份到网盘。整个项目很大。只能将源代码打包放上去。

 

 

2016-09-19 20:52:07 qq992817263 阅读数 6561
  • 从这里开始虚幻4-Editor介绍 v4.18

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

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

项目中需要控制成批的物体的透明度,但是默认的时候他又不能是透明的,对,项目的要求就这么诡异。

然而却没有找到设置材质的BlendMode的功能,于是只有换了一种办法,物体需要透明时更换为透明材质,默认的时候使用初始的材质,当然我也不会为了每个材质单独再建一个透明材质,这工作量想想都不科学。这里,只是为自己的解决方案作了一个记录,算不上实用。


1.创建一个透明材质,作为通用的资源,并创建三个变量,一个主纹理,一个主颜色,一个透明度值就够了


2.默认材质,我们也需要将他的主纹理或者主颜色定义为变量,方便后面获取,比如这里截图的就是一个主颜色变量,我这里名称都统一为MainColor,MainTexture


3.在C++中定义一些公开变量,具体作用有注释,比如我们开始创建的透明材质也可以会通过这个赋值

        /** 模型透明标签 */
	UPROPERTY(EditDefaultsOnly, Category = "Transparency")
	FName TransCompontTag;
	/** 材质透明参数名称 */
	UPROPERTY(EditDefaultsOnly, Category = "Transparency")
	FName TransMaterialPar;
	/** 材质主纹理的参数名称 */
	UPROPERTY(EditDefaultsOnly, Category = "Transparency")
	FName TransMaterialTex;
	/** 材质主纹理的参数名称 */
	UPROPERTY(EditDefaultsOnly, Category = "Transparency")
	FName TransMaterialColor;
	/** 透明材质 */
	UPROPERTY(EditDefaultsOnly, Category = "Transparency")
	UMaterialInterface* TransMaterial;
4.创建StaticMeshComponent数组,默认材质的TMap,透明材质的TMap,还有当前是否为透明状态

        /*透明模型*/
	TArray<UStaticMeshComponent*> _ArrayTransCompoent;
	/** 默认材质 */
	TMap<FString,UMaterialInterface*> _MapDefaultMaterials;
	/** 透明材质 */
	TMap<FString, UMaterialInstanceDynamic*> _MapTransMaterials;
	/** 是否透明 */
	bool _IsTrans=false;

5.创建一个函数,通过开始的透明材质创建UMaterialInstanceDynamic,并获取默认材质的主纹理或者主颜色赋值给透明材质,效果虽然没默认材质那么多效果,也不至于一片全白,然后参数传一个float值来控制透明度,操作中就可以用滑动条来控制,

#pragma region 设置物体透明度
void SetCompoentTrans(const float value)
{

#pragma region 通过标签获取需要透明的物体
	if (_ArrayTransCompoent.Num() == 0)
	{
		TArray<AActor*> _TempArrayOutActors;
		UGameplayStatics::GetAllActorsOfClass(GetWorld(), AStaticMeshActor::StaticClass(), _TempArrayOutActors);
		for (int32 i = 0; i < _TempArrayOutActors.Num(); i++)
		{
			UStaticMeshComponent* _TempStaticMesh = Cast<AStaticMeshActor>(_TempArrayOutActors[i])->StaticMeshComponent;
			TArray<FName> _TempArrayComTags = _TempStaticMesh->ComponentTags;
			for (int32 j = 0; j < _TempArrayComTags.Num(); j++)
			{
				if (_TempArrayComTags[j] == TransCompontTag)
				{
					_ArrayTransCompoent.Add(_TempStaticMesh);
					break;
				}
			}
		}
	}
#pragma endregion

#pragma region 利用TMap将透明物体的材质存储起来
	if (_MapDefaultMaterials.Num()==0)
	{
		for (int32 i = 0; i < _ArrayTransCompoent.Num();i++)
		{ 
			TArray<UMaterialInterface*> _TempArrayMaterials = _ArrayTransCompoent[i]->GetMaterials();
			for (int32 j = 0; j < _TempArrayMaterials.Num(); j++)
			{
				FString _TempStringKey = _ArrayTransCompoent[i]->GetAttachmentRootActor()->GetName()+"@"+FString::FromInt(j);
				_MapDefaultMaterials.Add(_TempStringKey, _TempArrayMaterials[j]);
			}
		}
	}
#pragma endregion

	if (value>0.97f)
	{
#pragma region 设置默认材质
		if (_IsTrans)
		{
			for (int32 i = 0; i < _ArrayTransCompoent.Num(); i++)
			{
				TArray<UMaterialInterface*> _TempArrayMaterials = _ArrayTransCompoent[i]->GetMaterials();
				for (int32 j = 0; j < _TempArrayMaterials.Num(); j++)
				{
					FString _TempStringKey = _ArrayTransCompoent[i]->GetAttachmentRootActor()->GetName() + "@" + FString::FromInt(j);
					_ArrayTransCompoent[i]->SetMaterial(j, _MapDefaultMaterials[_TempStringKey]);
				}
			}
			_IsTrans = false;
		}
#pragma endregion
	}
	else
	{
		if (!_IsTrans)
		{
#pragma region  创建透明材质
			if (_MapTransMaterials.Num() == 0)
			{
				for (int32 i = 0; i < _ArrayTransCompoent.Num(); i++)
				{
					TArray<UMaterialInterface*> _TempArrayMaterials = _ArrayTransCompoent[i]->GetMaterials();
					for (int32 j = 0; j < _TempArrayMaterials.Num(); j++)
					{
						FString _TempStringKey = _ArrayTransCompoent[i]->GetAttachmentRootActor()->GetName() + "@" + FString::FromInt(j);
						UMaterialInstanceDynamic*_TempMaterialID = _ArrayTransCompoent[i]->CreateDynamicMaterialInstance(0, TransMaterial);

						UTexture* _TempOutTexture;
						if (_MapDefaultMaterials[_TempStringKey]->GetTextureParameterValue(TransMaterialTex, _TempOutTexture))
						{
							_TempMaterialID->SetTextureParameterValue(TransMaterialTex, _TempOutTexture);
						}
						/*else
						{
							_TempOutTexture = Cast<UTexture>(StaticLoadObject(UTexture::StaticClass(), NULL, TEXT("/Game/Texture/Transparent/Tex_Transparent")));
						}
						_TempMaterialID->SetTextureParameterValue(TransMaterialTex, _TempOutTexture);*/
						FLinearColor _TempOutColor;
						if (_MapDefaultMaterials[_TempStringKey]->GetVectorParameterValue(TransMaterialColor, _TempOutColor))
						{
							_TempMaterialID->SetVectorParameterValue(TransMaterialColor, _TempOutColor);
						}

						_MapTransMaterials.Add(_TempStringKey,_TempMaterialID);
					}
				}
#pragma endregion
			}
			else
			{
#pragma region 设置透明材质
				for (int32 i = 0; i < _ArrayTransCompoent.Num(); i++)
				{
					TArray<UMaterialInterface*> _TempArrayMaterials = _ArrayTransCompoent[i]->GetMaterials();
					for (int32 j = 0; j < _TempArrayMaterials.Num(); j++)
					{
						FString _TempStringKey = _ArrayTransCompoent[i]->GetAttachmentRootActor()->GetName() + "@" + FString::FromInt(j);
						_ArrayTransCompoent[i]->SetMaterial(j, _MapTransMaterials[_TempStringKey]);
					}
				}
#pragma endregion
			}
			_IsTrans = true;
		}
		for (int32 i = 0; i < _ArrayTransCompoent.Num(); i++)
		{
			_ArrayTransCompoent[i]->SetScalarParameterValueOnMaterials(TransMaterialPar, value);
		}
	}
}
#pragma endregion


2019-05-10 21:25:45 qq_33465047 阅读数 144
  • 从这里开始虚幻4-Editor介绍 v4.18

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

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

首先,找一个文件夹,然后右击,会弹出下面所示的,点击Material建立一个材质,然后给命名,

在这儿将新建材质,命名为Wall,然后双击,进入材质编辑器。如下图:

材质编辑器,主要由5部分组成,1

1 :菜单栏+工具栏,2视口面板:预览材质实时的效果,3细节面板-----列出材质,所选材质的表现, 4 :代码编辑区:显示创建材质的指令 5:控制面板:列出所有材质着色器指令的材质表现和函数。

下面介绍一下材质中特别重要的基础部分:如左图所示。

其中常用的是:

 

 基础颜色,金属,高光,粗糙度,自发光颜色,法线.

基础颜色(Base Color):材质的基本颜色

金属(Metallic):定义材质有金属特性,设置范围在0-1之间。

高光(Specullar):调整的是非金属材质的高光反射程度。默认是0.5

粗糙度(Roughness):数值低的材质镜面反射的程度就越高,也就是越光滑。

自反光颜色(Emissive):定义材质自主发出光线的参数

法线(Normal):用于连接贴图,

了解这些就可以做出很多材质了,

 

 

 

在材质编辑器一些常见的快捷键(注意,按键的同时,左击鼠标,才会有反映)

键盘撒上的数字1,2,3,:是用来创建常量和向量的节点,

U:贴图坐标

T:贴图取样器

M和D:创建加法、乘法和除法的节点。

删除节点:就是delete

 

然后实际操作一下:

首先,按下键盘的数字3同时单机左键,会出现一个向量,用来设置基础颜色,双击这个向量,选择一个颜色。然后再按下数字1的同时单机左键,会出现一个标量,将它与金属属性相连,然后单机编辑器的左上方,Apply按钮,会出现一下效果。

 

2016-06-17 09:50:12 fyyzwsws 阅读数 12369
  • 从这里开始虚幻4-Editor介绍 v4.18

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

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

Unreal Engine4(虚幻4)学习心得-材质

材质

制作材质的过程其实就相当于在写shader,只是UE4制作材质使用的是可视化方式在写shader。下面将介绍一些材质属性:

  • Blend Mode混合模式
    用于决定材质颜色如何和背景颜色混合。
    1. Opaque不透明
    2. Masked蒙版,蒙版材质可以利用蒙版贴图,将一些区域设置为可见或者不可见,比如铁丝网就可以使用蒙版
    3. Translucent半透明,可以以某种形式允许光线透过,比如玻璃
    4. Additive叠加,有透明度,用于增加颜色信息,比如各种粒子效果
    5. Modulate调制,将材质颜色乘以背景颜色,适合做贴花效果
  • Lighting Mode光照模式
    当半透明/透明的时候使用。
    1. Volumetric NonDirectional,是最节省的光照模式,只使用漫反射颜色,不用考虑材质法线。严格的说,只对动态光照的物体有效。
    2. Volumetric Directional,考虑材质法线。
    3. Volumetric PreVertex NonDirectional,同Volumetric NonDirectional,但是光照只在顶点计算,这样会减轻PS的消耗。
    4. Volumetric PreVertex Directional,同Volumetric Directional,但是光照只在顶点计算,这样会减轻PS的消耗。
  • Base Color常规色
    通常会通过PS制作一些贴图,作为基本色。所有的贴图都可以通过UV设置其平铺状态
  • Emissive自发光
    能让材质自己发光,可以用于制作材质外边缘的光晕效果。
  • Specular高光
    用于控制高光的颜色。光源照射到物体然后反射到人的眼睛里时,物体上最亮的那个点就是高光。高光控制着光线的反射,以展现一种光泽的效果。
  • Opacity不透明
    用于控制物体的透明度。
  • OpacityMask不透明蒙版
    用于和混合模式中的Masked蒙版模式组合使用,包含了可见还是不可见信息蒙版贴图就在这里连接。
  • Normal法线
    法线贴图是材质具有凹凸效果的原因。除非制作的是玻璃或者金属球之类的非常光滑的物体,否则一定要用法线。可以再加上一张细节贴图,与法线贴图相加,一起当做法线贴图。但是法线贴图中的凹凸信息其实是存在于RG通道中,B通道好比基准线,也就是被RG弄皱的底平面,因此如果想再加上一张细节贴图的话,蓝色通道千万不能动。法线贴图通过RGB的信息,以像素为单位来指定表面角度。
  • WorldPositionOffset世界位置偏移量
    只有要跟踪某个材质的世界位置,并且要沿某个方向移动它,这个属性才会被用到。

材质的其他属性(UDK)

  • Diffuse漫反射
    提供不透明颜色,好比常规颜色。通常会通过PS制作一些贴图(包含alpha通道,法线贴图),作为漫反射的基本色。
  • DiffusePower漫反射次幂
    描述颜色随光照信息的流失,从饱和向阴暗渐变的速度。
  • SpecularPower高光次幂
    用来模拟光滑度。
  • Distortion扭曲
    它能使一个对象表面的材质发生扭曲。使用方式比如:把混合模式设置为Additive叠加,然后设置无光照,然后把法线贴图连接到扭曲上(扭曲接收的就是法线信息,它要利用RGB通道来决定把像素点移到多远),就能看到热浪的效果,类似折射。
  • TransmissionColor透射色
    设置一个颜色,这样穿过物体表面的光线,好像会穿透物体扩散开来,呈现出次表面散射(3S)的样子(透射蒙版要设置为1才能看到)。比如设计角色的耳朵的时候,将耳朵部分的透射蒙版设置为1,然后将投射色设置为深红,那么当光线射到耳朵背面的时候,耳朵看上去就有次表面散射的效果。(这里只是模拟S3,而非真正的S3,但是很逼真,移动光源就可以看到半透明的效果)
  • TransmissionMask透射蒙版
    0和1组成的蒙版贴图用于决定哪里需要透射。透射色和透射蒙版主要用于蜡和人皮肤之类的地方
  • BumpOffset凹凸偏移
    凹凸偏移需要借用高度贴图。高度贴图可以使用法线贴图的alpha作为其高度值,然后将高度贴图作为基本色和法线的UV即可。
2018-06-11 15:38:10 zsyddl2 阅读数 452
  • 从这里开始虚幻4-Editor介绍 v4.18

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

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

   目前未找到直接手动创建完整材质的办法,感觉不太方便。 目前的办法是:在编辑器中创建需要的材质比如 顶点颜色材质、颜色材质、图片材质等。并将输入的数据添加到参数,这样可以在程序运行中修改顶点颜色,材质颜色,或者材质图片。

  顶点颜色材质:

    

   颜色材质创建:

  

 动态修改颜色:

  FString strMaterial = TEXT("/Game/StarterContent/Materials/M_Color.M_Color");

    ((AUeCustomActor*)m_pUeActor)->LoadSpecialMaterial(strMaterial, pColorMaterial, false);

    FLinearColor linearColor(color.m_fR, color.m_fG, color.m_fB, color.m_fA);
    
 
    UMaterialInstanceDynamic* pDynamicMaterial = UMaterialInstanceDynamic::Create(pColorMaterial, nullptr);// new UMaterialInstanceDynamic();
 
    pDynamicMaterial->SetVectorParameterValue(FName("BaseColor"), linearColor);

    pProcMesh->SetMaterial(nSection, pDynamicMaterial);

 图片材质 未测试。这种应该是可以冬天替换,比如用于播放视频。


  补充 LoadSpecialMaterial:

  
void AUeCustomActor::LoadSpecialMaterial(const FString& MaterialName, UMaterial*& Material, bool bCheckUsage)
{
    // only bother with materials that aren't already loaded
    if (Material == NULL)
    {
        // find or load the object
        Material = LoadObject<UMaterial>(NULL, *MaterialName, NULL, LOAD_None, NULL);

        if (!Material)
        {
#if !WITH_EDITORONLY_DATA
            UE_LOG(LogEngine, Log, TEXT("ERROR: Failed to load special material '%s'. This will probably have bad consequences (depending on its use)"), *MaterialName);
#else
            UE_LOG(LogEngine, Fatal, TEXT("Failed to load special material '%s'"), *MaterialName);
#endif
        }
        // if the material wasn't marked as being a special engine material, then not all of the shaders
        // will have been compiled on it by this point, so we need to compile them and alert the use
        // to set the bit
        else if (!Material->bUsedAsSpecialEngineMaterial && bCheckUsage)
        {
#if !WITH_EDITOR
            // consoles must have the flag set properly in the editor
            UE_LOG(LogEngine, Fatal, TEXT("The special material (%s) was not marked with bUsedAsSpecialEngineMaterial. Make sure this flag is set in the editor, save the package, and compile shaders for this platform"), *MaterialName);
#else
            Material->bUsedAsSpecialEngineMaterial = true;
            Material->MarkPackageDirty();

            // make sure all necessary shaders for the default are compiled, now that the flag is set
            Material->PostEditChange();

            FMessageDialog::Open(EAppMsgType::Ok, FText::Format(NSLOCTEXT("Engine", "SpecialMaterialConfiguredIncorrectly", "The special material ({0}) has not been marked with bUsedAsSpecialEngineMaterial.\nThis will prevent shader precompiling properly, so the flag has been set automatically.\nMake sure to save the package and distribute to everyone using this material."), FText::FromString(MaterialName)));
#endif
        }
    }
}

unreal4 源码引言

阅读数 257

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