材质可以通过蓝图进行设置,也可以通过c++动态给材质设置参数,进行修改材质的数据,这里记录一些有关材质的知识点,如有错误,欢迎指正。
1. c++代码中创建mesh
// 在Actor类构造函数中自定义mesh或者获取mesh对象
UProceduralMeshComponent * mesh = CreateDefaultSubobject(TEXT("terrainMesh"));
RootComponent = mesh;
mesh->bUseAsyncCooking = true;
2. 在c++中通过代码动态加载材质。
// 在需要的函数中,加载目标材质
static UMaterialInterface* pMaterialInterface = LoadObject(nullptr, TEXT("/Supermap/Materials/Global"));
UMaterialInstanceDynamic* pMat = UMaterialInstanceDynamic::Create(pMaterialInterface, nullptr);
// 设置材质
mesh->SetMaterial(0, pMat);
3. 在C++中通过代码给材质中参数设置数据
// 给一个float类型变量设置值,第一个参数是变量的名称
pMat->SetScalarParameterValue(FName("FloatValue"), 1);
// 给一个向量类型变量设置值,第一个参数是变量的名称
FColor cLineColor = FColor(255, 255, 0, 255);
pMat->SetVectorParameterValue(FName("VectorValue"), FLinearColor(cLineColor));
// 给一个类型变量设置值,第一个参数是变量的名称
UTexture2D* colorTableTexture;
pMat->SetTextureParameterValue(FName("TextureValue"), colorTableTexture);
// 用来创建纹理对象的函数
void InitialColorTableTexture2()
{
ReleaseTexture();
// TODO:解析颜色表文件
int nWidth = 1;
int nHeight = 10;
colorTableTexture= UTexture2D::CreateTransient(nWidth, nHeight, PF_R8G8B8A8);
colorTableTexture->AddressX = TextureAddress::TA_Clamp;
colorTableTexture->AddressY = TextureAddress::TA_Clamp;
colorTableTexture->AddToRoot();
uint8* pTextureData = new uint8[nWidth * nHeight * 4];
for (int i = 0; i < nHeight; i++)
{
float z = pow(float(i+1) / nHeight), 2) * nHeight;
pTextureData[i * 4 + 0] = 25 * z;
pTextureData[i * 4 + 1] = 255 - 25 * z;
pTextureData[i * 4 + 2] = 0;
pTextureData[i * 4 + 3] = 255;
}
FTexture2DMipMap& pTexture2DMipMap = colorTableTexture->PlatformData->Mips[0];
int64 nBufferSize = pTexture2DMipMap.BulkData.GetBulkDataSize();
void* Data = pTexture2DMipMap.BulkData.Lock(LOCK_READ_WRITE);
FMemory::Memcpy(Data, pTextureData, nBufferSize);
pTexture2DMipMap.BulkData.Unlock();
colorTableTexture->UpdateResource();
delete[] pTextureData;
pTextureData = nullptr;
}
// 用来释放纹理数据的函数
void ReleaseTexture()
{
if (colorTableTexture== nullptr)
{
return;
}
colorTableTexture->RemoveFromRoot();
colorTableTexture->MarkPendingKill();
colorTableTexture= nullptr;
}
4. 在C++中设置纹理可能用到的多个UV坐标值,这个是通过mesh创建绘图内容的时候,通过绘图数据进行设置的,而不是直接给纹理设置的数据
mesh->CreateMeshSection_LinearColor(0, vertices, Triangles, normals, UV0, UV1, UV2, UV3, vertexColors, tangents, true);
// mesh->CreateMeshSection_LinearColor(0, vertices, Triangles, normals, UV0, vertexColors, tangents, true);
mesh->ContainsPhysicsTriMeshData(true);
在材质中使用UV坐标值的方法, 下标2表示UV2,同理下标为0,则为UV0
BreakOutFloat2Components函数的具体实现内容:
5. 蓝图中添加自定义参数,下述三个自定义类型,对应第3点,可以通过c++代码给这些变量赋值。
添加float类型参数
添加VectorColor类型参数
添加colorTableTexture类型参数
6. 在材质蓝图中添加自定义函数的方法
7. 几个纹理常用的函数。
常用变量类型 float、float2、float3、float4。
clamp:强制范围,三个参数,将参数1强制约束在参数2和参数3之间。
lerp:插值,如果Alpha在0到1之间,Alpha值越接近0则ReValue的值越接近A,Alpha值越接近1则ReValue的值越接近B