這段時間實在太懶了。往年,十個這玩意都寫好了。
現在基本的資料結構已經確定了。shader的代碼(骨架類)既可以單獨用,也可以由Node串起來。
預計Shader的用法為
//載入一個由SimpleTrans.hlsl 為基礎骨架,加上Skin, Morph兩個Node動態產生的Shader.
HXShader hShader = m_ShaderMgr.load(L"SimpleTrans<Skin, Morph>");
//載入SimpleTrans.hlsl。
HXShader hShader = m_ShaderMgr.load(L"SimpleTrans");
這樣用法可以防止在引擎中產生Shader爆炸,只需要寫幾個基礎骨架,並加一些 Node, Node符合規範就可以隨意組合了。
不過目前所有的額外資訊都需要從.hlsl本身裡解析,所以需要一定的規範,一個簡單的Shader大概如下。
//一個用來示範的Shader基礎類, PixelShader
///{{Declaration
//視頻處理的PS
sampler2D YTextue;
sampler2D UTextue;
sampler2D VTextue;
float cTime;
struct PS_INPUT
{
float2 Texcoord : TEXCOORD0;
};
///}}
/*
///{{ParamTable //Shader的參數描述表
texture YTexture : <file="" , manager="" , width="" , height="" /> ;
float cTime : TIME ;
///}}
*/
///{{SourceCode
float4 main( PS_INPUT Input ) : COLOR0
{
//===採樣輸入器=====================================
float3 yuvColor;
yuvColor.x = tex2D( YTextue, Input.Texcoord ).x;
yuvColor.y = tex2D( UTextue, Input.Texcoord ).x;
yuvColor.z = tex2D( VTextue, Input.Texcoord ).x;
//==================================================
///}}
/*
///{{Socket = Name // Socket = 名字, 在這裡定義一個插入點
Input
{
float3 yuvColor : YUVCOLOR;
}
Output
{
float4 RGBColor : COLOR0;
}
///}}
*/
///{{DefaultCode = Name
//預設的代碼 ,如果Name指定的插槽沒有插入Node。則該代碼才會被編譯進去
float4 RGBColor = float4(yuvColor,1.0);
///}}
///{{SourceCode
//==================================================
return RGBColor;
}
///}}
一個簡單的Node如下
/*
///{{Slot = Description
Input
{
float4 yuvColorIn : YUVCOLOR; // 類型 名字 : 語義
}
Output
{
float4 : COLOR0;
}
///}}
*/
///{{Declaration
float4 CS_YUV2RGB(float4 yuvColorIn);
///}}
///{{SourceCode
float4 CS_YUV2RGB(float4 yuvColorIn)
{
//==ColorSpace======================================
float3 delYuv = float3(-16.0/255.0 , -128.0/255.0 , -128.0/255.0);
float3 yuvColor = yuvColorIn.xyz + delYuv;
float3 matYUVRGB1 = float3(1.164, 2.018 , 0.0 );
float3 matYUVRGB2 = float3(1.164, -0.391 , -0.813 );
float3 matYUVRGB3 = float3(1.164, 0.0 , 1.596 );
float4 rgbColor;
rgbColor.x = dot(yuvColor,matYUVRGB1);
rgbColor.y = dot(yuvColor,matYUVRGB2);
rgbColor.z = dot(yuvColor,matYUVRGB3);
rgbColor.w = 1.0f;
//==================================================
return rgbColor;
}
///}}