Unigine纹理材质Unigine::Material、Unigine::Texture简介和使用注意事项

Unigine::Material:

Unigine多数渲染效果体现在其材质类中Unigine::Material,如各种纹理贴图和Shader着色器都在其中,不过Unigine对用户使用材质限制颇多,例如你不能直接向new一个对象一样new一个材质,它(Unigine2.5版本)没有构造函数,只能从文件中读取或在代码中从基础材质继承,当然即使是文件中的材质也必须从某类基础材质继承。例如在材质文件中这样:

	
		1
		emptyTile.png
		0.75 0.75 0.75 1
	

在代码里这样:

Unigine::MaterialPtr copyMat = m_object->getMaterialInherit(i);

Unigine内部维护了大约25种基础材质库,分别对应Unigine不同渲染对象,如下:

billboards_base
billboards_cloud_base
billboards_impostor_base
clouds_base
decal_base
decal_terrain_hole_base
grass_base
grass_impostor_base
gui_base
mesh_base
particles_base
render_composite
sky_base
terrain_base
terrain_global_base
volume_cloud_base
volume_fog_base
volume_light_base
volume_omni_base
volume_proj_base
volume_shaft_base
water_global_base
water_mesh_base
Postprocess Materials
debug_materials

这些材质在引擎启动时默认加载(引擎目录data下面有这些.mat材质文件),无论你用不用,他们都在内存里。

Unigine纹理材质Unigine::Material、Unigine::Texture简介和使用注意事项_第1张图片

这里有个问题,如果你多个对象都是用同一个材质名或者基础材质而在代码里不继承创建新独立子材质实例的话,材质会被共用,也就是说你改一个对象材质纹理,其他所有对象材质纹理都会被更改。其关键是这个接口:

getMaterialInherit

经大量快速更换纹理测试发现材质类的setImageTexture方法效率很高,但相应的GPU利用率比较高,

setImageTextureImage方法效率较低,相应GPU几乎没有消耗,但是CPU利用率较高。

 

.Unigine::Texture:

unigine的纹理被包含在材质中的,例如你想更改某材质的纹理可以这样:

Unigine::MaterialPtr ptrMat = m_ptrDecal->getMaterialInherit();
int nTexId = ptrMat->findTexture("albedo");
ptrMat->setImageTextureImage(nTexId, ptrImage,1);

注意此接口第三个参数dynamic要设为1,不然此改变会应用到其他同类材质,设为为1说明只对当前材质有效!

有多种纹理类型,例如上面的albedo基础反射颜色,即纹理像素,还有法线贴图等其他多种纹理类型:

	
		
		core/textures/terrain_base_diffuse.dds
		core/textures/terrain_base_diffuse.dds
		core/textures/terrain_base_specular.dds
		core/textures/terrain_base_normal.dds
		0.407843 0.407843 0.407843 0.5
		0.407843 0.407843 0.407843 0.5
		0
	

 

同样的经大量快速更换纹理的image测试发现纹理类setImage方法效率很高,但相应的GPU利用率比较高,

create方法效率较低,相应GPU几乎没有消耗,但是CPU利用率较高。

你可能感兴趣的:(Unigine纹理材质Unigine::Material、Unigine::Texture简介和使用注意事项)