消失の彼岸线 发表于 2020-11-25 09:03

Unreal材质添加全局贴图

Unreal没有提供一个可以被所有Shader使用的贴图,这在做一些全局贴图影响的材质很不方便,需要程序管理一个材质列表去动态地改变材质贴图,但是有时候这样的物体特别多,比如草这一类的shader可能需要一个全局贴图如风场这类的,风可能在游戏中出现变化,这样就比较麻烦了。


定义GlobalShaderTexture
打开SceneView.h,找到#define VIEW_UNIFORM_BUFFER_MEMBER_TABLE 这个里边定义了很多全局使用得变量,我们添加我们所需要的GlobalTexture和Sampler。




初始化
打开SceneManagement.cpp,在FViewUniformShaderParameters构造函数中,初始化GlobalTex。




做完这些,你基本就能在Shader中使用View.ShaderGlobalTex这个贴图变量去干自己的事情了。


更新
我们最终的目的是为了能切换贴图全局影响材质,所以我们需要更新贴图。打开SceneRendering.cpp,找到FViewInfo::SetupUniformBufferParameters这个里边会去设置刚刚定义所有的View全局变量。我们找个地方把GlobalTex设置到ViewUniformShaderParameter中去。




这里是把贴图存放在SkyLight上,然后去上面取,修改SkyLight的这个Tex,就会影响到全局。你可以按照你自己的需求在你的C++代码中设置到引擎底层能访问到的地方,然后在这里去取出来赋值就可以。我还是把我的SkyLight的这些代码贴上吧,这里不必按照我这里的操作。
打开SkyLightComponent.h,定义GlobaTex,在界面上显示。




打开SceneManagement.h,找到FSkyLightSceneProxy的定义,添加GetGlobalTex方法。




打开SkyLightComponent.cpp,实现GetGlobalTex




使用
按照上面流程写完,编译运行代码,时间可能有点长,因为要编译shader。
新建一个材质,打开材质蓝图
新建一个Custom节点使用View.GlobalTex




Code可以这么写
ProcessMaterialColorTextureLookup(Texture2DSampleBias(View.ShaderGlobalTex, View.ShaderGlobalTexSampler,UVs.xy,View.MaterialTextureMipBias))
ProcessMaterialColorTextureLookup表示SampleType是Color,新建了一个UV的Input节点。




我们复制这个材质,随便改改。




如图,上个盒子挂上生成的三个材质。在场景中找到SkyLight,在我们刚刚写的面板上找到GLobalTex。




试着替换这张贴图,三个盒子的贴图就全被替换了。


页: [1]
查看完整版本: Unreal材质添加全局贴图