|
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。
试着替换这张贴图,三个盒子的贴图就全被替换了。
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
|