NPLRuntime
NPLRuntime copied to clipboard
next step on avatar
之前哈奇将人物换装写到C++中, 我是有点后悔的,导致C++有大量非通用逻辑代码。还是希望能用更通用的方式通过脚本或FBX部分的代码,实现MaskTexture。 我们是否可以考虑将MaskTexture逻辑使用
因为我们的avatar设计有可以允许用户自定义一部分材质颜色这个需求,而这个是需要通过一张mask图来标识的。到了具体实现上,因为现在整个渲染流程非常静态,在此基础上要增加这张mask的支持,势必要更改c++部分的代码,如果引擎侧硬要做的通用一些的话,最多就是这个不叫mask,而改叫个custom tex之类的名字,由使用者决定用它来做什么用途,但是逻辑基本还是这个逻辑。 另外如果渲染部分能够做到其它游戏引擎那样支持任意shader任意材质通道任意参数都交由上层逻辑控制的话,这部分就不需要写到引擎本身里面了。但这个工程量就相当巨大。
--[[
NPL.load("(gl)script/ide/Effect/frozenEffect.lua");
local FrozenEffect = commonlib.gettable("MyCompany.Aries.FrozenEffect");
--]]
NPL.load("(gl)script/apps/Aries/Quest/NPC.lua");
local NPC = commonlib.gettable("MyCompany.Aries.Quest.NPC");
local FrozenEffect = commonlib.gettable("MyCompany.Aries.FrozenEffect");
local frozen_shader_file = "script/ide/Effect/Shaders/frozen.fxo";
local frozen_effect_handle = 1101;
local default_effect_handle = 12;
function FrozenEffect.CreateFrozenEffect()
local effect = ParaAsset.GetEffectFile("frozen");
if(effect:IsValid() == false)then
LOG.std(nil, "debug", "FrozenEffect", "shader file %s is loaded", frozen_shader_file);
effect = ParaAsset.LoadEffectFile("frozen",frozen_shader_file);
effect = ParaAsset.GetEffectFile("frozen");
effect:SetHandle(frozen_effect_handle);
local params = effect:GetParamBlock();
params:SetTexture(1,"Texture/Aries/ShaderResource/frozenNoise.dds");
else
local handle = effect:GetHandle();
if(handle == -1)then
effect:SetHandle(frozen_effect_handle);
end
end
return effect,frozen_effect_handle;
end
--@return effectHandle: remember the previous effect so you can set it back later
function FrozenEffect.ApplyFrozenEffect(character)
if(character and character:IsValid())then
local prevEffectHandle = character:GetField("render_tech",nil);
local effect,effectHandle = FrozenEffect.CreateFrozenEffect();
character:SetField("render_tech",effectHandle);
character:SetField("RenderImportance", 3);
character:SetField("IsAnimPaused", true);
return prevEffectHandle;
end
end
function FrozenEffect.ResetEffect(character, effectHandle)
effectHandle = effectHandle or default_effect_handle;
if(character and character:IsValid())then
FrozenEffect.prevEffectHandle = character:GetField("render_tech",nil);
character:SetField("render_tech",effectHandle);
character:SetField("RenderImportance", 0);
character:SetField("IsAnimPaused", false);
end
end
之前哈奇中有个冰冻效果, 可以调用外部的shader代码, opengl暂时没有提供动态加载接口, 可以加下。
ParaObject::GetEffectParamBlock()
可以设置每个Object的effect params, 包括几个颜色和贴图。