UE4 C++ 记录几个有关材质的知识点

材质可以通过蓝图进行设置,也可以通过c++动态给材质设置参数,进行修改材质的数据,这里记录一些有关材质的知识点,如有错误,欢迎指正。

1. c++代码中创建mesh

// 在Actor类构造函数中自定义mesh或者获取mesh对象
UProceduralMeshComponent * mesh = CreateDefaultSubobject<UProceduralMeshComponent>(TEXT("terrainMesh"));    
RootComponent = mesh;
mesh->bUseAsyncCooking = true;

2. 在c++中通过代码动态加载材质。

// 在需要的函数中,加载目标材质
static UMaterialInterface* pMaterialInterface = LoadObject<UMaterialInterface>(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

 

 

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值