NPLRuntime icon indicating copy to clipboard operation
NPLRuntime copied to clipboard

next step on avatar

Open imfoollink opened this issue 7 years ago • 3 comments

imfoollink avatar Aug 29 '17 08:08 imfoollink

之前哈奇将人物换装写到C++中, 我是有点后悔的,导致C++有大量非通用逻辑代码。还是希望能用更通用的方式通过脚本或FBX部分的代码,实现MaskTexture。 我们是否可以考虑将MaskTexture逻辑使用

LiXizhi avatar Aug 30 '17 01:08 LiXizhi

因为我们的avatar设计有可以允许用户自定义一部分材质颜色这个需求,而这个是需要通过一张mask图来标识的。到了具体实现上,因为现在整个渲染流程非常静态,在此基础上要增加这张mask的支持,势必要更改c++部分的代码,如果引擎侧硬要做的通用一些的话,最多就是这个不叫mask,而改叫个custom tex之类的名字,由使用者决定用它来做什么用途,但是逻辑基本还是这个逻辑。 另外如果渲染部分能够做到其它游戏引擎那样支持任意shader任意材质通道任意参数都交由上层逻辑控制的话,这部分就不需要写到引擎本身里面了。但这个工程量就相当巨大。

imfoollink avatar Aug 30 '17 02:08 imfoollink

--[[
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, 包括几个颜色和贴图。

LiXizhi avatar Aug 30 '17 03:08 LiXizhi