Node Based Shader

Posted 潘李亮

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Node Based Shader相关的知识,希望对你有一定的参考价值。

这段时间实在太懒了。往年,十个这玩意都写好了。

现在基本的数据结构已经确定了。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;
}
///}}

 

 

以上是关于Node Based Shader的主要内容,如果未能解决你的问题,请参考以下文章

Node Based Shader系统基本完成,进入调试和优化阶段

Unity ShaderShader纹理映射的例子

UnityShader之固定管线Fixed Function ShaderShader资料3

Author name disambiguation using a graph model with node splitting and merging based on bibliographi

UnityShader之顶点片段着色器Vertex and Fragment ShaderShader资料

juju based openstack upgrade (by quqi99)