Node Based Shader

來源:互聯網
上載者:User

這段時間實在太懶了。往年,十個這玩意都寫好了。

現在基本的資料結構已經確定了。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;
}
///}}

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.