UE4成批处理透明材质
项目中需要控制成批的物体的透明度,但是默认的时候他又不能是透明的,对,项目的要求就这么诡异。
然而却没有找到设置材质的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
UE4成批处理透明材质的更多相关文章
- Unity透明材质Batch
NO Batch ? 游戏场景中存在大量例子的时候,DrallCall的压力很大,但是遍历一遍之后发现,为啥一样的粒子特效竟然没有合并,why?经过很多测试后发现,如果把透明材质的修改为非半透明的, ...
- UE4材质初探
转自:http://www.unrealchina.net/portal.php?mod=view&aid=233 UE4的材质表面上看起来很简单,可是到了用的时候却总是没有办法实现好的效果. ...
- Unity 游戏开发技巧集锦之创建透明的材质
Unity 游戏开发技巧集锦之创建透明的材质 Unity创建透明的材质 生活中不乏透明或者半透明的事物.例如,擦的十分干净的玻璃,看起来就是透明的:一些塑料卡片,看起来就是半透明的,如图3-23所示. ...
- UE4 Fade out Mesh
由于项目需要一个将场景慢慢淡入以及淡出的效果,所以就想了想实现思路.因为PBR光照模型是不支持透明物体的渲染的,所以UE4中的PBR材质在为Opaque时是无法改变透明度的,想来想去想不出解决方法,然 ...
- UE4里的自定义深度功能
转自:http://www.52vr.com/article-1866-1.html 随着物理渲染系统的发布,虚幻引擎4同时引进了一个新的深度缓存功能,它叫作“自定义深度”,可以用于诸如编辑器里的选择 ...
- 通过优化在UE4中实现良好性能和高质量视觉效果
转自:http://gad.qq.com/program/translateview/7160166 译者:赵菁菁(轩语轩缘) 审校:李笑达(DDBC4747) 对于任何追求UE4性能最佳.同时又想 ...
- 充分利用 UE4 中的噪声
转自:https://www.unrealengine.com/zh-CN/blog/getting-the-most-out-of-noise-in-ue4 UE4 推出基于材质的程序式噪声已经有一 ...
- Houdini技术体系 基础管线(四) :Houdini驱动的UE4植被系统 下篇
背景 在上篇中,实现了使用Houdini在UE4里根据地形过程生成植被的最基本的原型.并且支持把植被在UE4里Bake成使用的HierarchicalInstancedStaticMeshCompon ...
- (转)透明光照模型与环境贴图之基础理论篇(折射率、色散、fresnel定律) .
摘抄“GPU Programming And Cg Language Primer 1rd Edition” 中文名“GPU编程与CG语言之阳春白雪下里巴人” 材质和光的交互除了反射现象,对于透明物 ...
随机推荐
- [SDOI2009]HH去散步
题目描述 HH有个一成不变的习惯,喜欢饭后百步走.所谓百步走,就是散步,就是在一定的时间 内,走过一定的距离. 但是同时HH又是个喜欢变化的人,所以他不会立刻沿着刚刚走来的路走回. 又因为HH是个喜欢 ...
- hdu 5317 合数分解+预处理
RGCDQ Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submi ...
- bzoj3126[Usaco2013 Open]Photo 单调队列优化dp
3126: [Usaco2013 Open]Photo Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 374 Solved: 188[Submit] ...
- [Project] Simulate HTTP Post Request to obtain data from Web Page by using Python Scrapy Framework
1. Background Though it's always difficult to give child a perfect name, parent never give up trying ...
- SpringCloud学习之feign
一.关于feigin feigin是一种模板化,声明式的http客户端,feign可以通过注解绑定到接口上来简化Http请求访问.当然我们也可以在创建Feign对象时定制自定义解码器(xml或者jso ...
- 智能优化算法对TSP问题的求解研究
要求: TSP 算法(Traveling Salesman Problem)是指给定 n 个城市和各个城市之间的距离,要 求确定一条经过各个城市当且仅当一次的最短路径,它是一种典型的优化组合问题,其最 ...
- 特殊权限 SUID、SGID、Sticky
摘录之----------QuintinX 一. 前提 本篇主要讲解SUID, SGID, Sticky三个权限的基本原理和应用. 为什么要使用特殊权限? 比如系统中假如有超过四类人然而每一类人都需要 ...
- Python学习--课本程序练习(周更)
1.绘制正方形螺旋线 import turtle turtle.setup(600,300,200,200) turtle.pensize(1) turtle.color('green') i=0 w ...
- Java并发之BlockingQueue的使用
Java并发之BlockingQueue的使用 一.简介 前段时间看到有些朋友在网上发了一道面试题,题目的大意就是:有两个线程A,B, A线程每200ms就生成一个[0,100]之间的随机数, B线 ...
- 【问底】徐汉彬:亿级Web系统搭建——单机到分布式集群
http://www.csdn.net/article/2014-11-06/2822529/3 大规模流量的网站架构,从来都是慢慢"成长"而来.而这个过程中,会遇到很多问题,在不 ...