HLSL Effect的vertex shader和pixel shader的参数传递

来源:互联网 发布:山西大数据培训机构 编辑:程序博客网 时间:2024/05/23 01:12
 HLSL基本以C语言的习惯来写的,但是如果完全以C语言的角度来看,我个人感觉入门最难理解就是顶点着色器和像素着色器的两个函数的参数传递了。

  下面以最简单的HLSL中效果框架举例说下自己的理解。

  uniform extern float4x4 gWVP;

 

  struct OutputVS

  {

      float4 posH  : POSITION0;

      float4 color : COLOR0;

  };

 

  OutputVS ColorVS(float3 posL : POSITION0, float4 c : COLOR0)

  {

    // Zero out our output.

  OutputVS outVS = (OutputVS)0;

 

  // Transform to homogeneous clip space.

  outVS.posH = mul(float4(posL, 1.0f), gWVP);

 

  // Just pass the vertex color into the pixel shader.

  outVS.color = c;

  // Done--return the output.

  return outVS;

  }

 

  float4 ColorPS(float4 c : COLOR0) : COLOR

  {

      return c;

  }

 

  technique ColorTech

  {

      pass P0

      {

          // Specify the vertex and pixel shader associated with this pass.

          vertexShader = compile vs_2_0 ColorVS();

          pixelShader  = compile ps_2_0 ColorPS();

      }

  }

  首先是定义的OutputVS,这里是作为顶点着色器的输出,先不用管。看顶点着色器函数里面的参数:
  OutputVS ColorVS(float3 posL : POSITION0, float4 c : COLOR0)
  {
  }
  相比C语言函数,最让初学者疑惑的是里面两个参数float3 posL : POSITION0, float4 c : COLOR0是哪里传进来的?其实这两个参数是固定的由Directx的pipeline传进来的。在Directx中我们都会定义我们的顶点格式以及为其注册,如下:
//============================================================
//先在Directx的相关初始化函数定义我们的顶点格式
  struct VertexCol
  {
  VertexCol():pos(0.0f, 0.0f, 0.0f),col(0x00000000){}
  VertexCol(float x, float y, float z, D3DCOLOR c):pos(x,y,z), col(c){}
  VertexCol(const D3DXVECTOR3& v, D3DCOLOR c):pos(v),col(c){}
 
  D3DXVECTOR3 pos;
  D3DCOLOR    col;
  static IDirect3DVertexDeclaration9* Decl;
  };
  D3DVERTEXELEMENT9 VertexColElements[] = 
  {
  {0, 0,  D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0},
  {0, 12, D3DDECLTYPE_D3DCOLOR, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_COLOR, 0},
  D3DDECL_END()
  };
  HR(gd3dDevice->CreateVertexDeclaration(VertexColElements, &VertexCol::Decl));
//=============================================================
//然后在调用IDirect3DDevice9::Draw**()之类函数之前告知Directx我们的顶点格式。
   HR(gd3dDevice->SetVertexDeclaration(VertexCol::Decl));
//================================================================
  这样我们在D3DVERTEXELEMENT9里面定义的顶点成分{……D3DDECLUSAGE_POSITION, 0}就会传递给顶点着色器参数中的float3 posL : POSITION0, 而和{……D3DDECLUSAGE_COLOR, 0}就传给顶点着色器参数中的float4 c : COLOR0。
  顶点着色器计算好后得到每个像素的OutputVS,输出到像素着色器中。
  //=============================
  float4 ColorPS(float4 c : COLOR0) : COLOR

  {

      return c;

  }

 如上像素着色器的float4 c : COLOR0则来自于OutputVS中的float4 color : COLOR0;

 像素着色器再输出计算得到的每个像素的颜色值,就是我们在屏幕看到的结果了。

 

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 割双眼皮后出血怎么办 双眼皮手术后出血怎么办 缝双眼皮开了怎么办 朋友网没了怎么办 压疮发生后怎么办 学籍账号已登录怎么办 护士学分不达标怎么办 高中学籍错了怎么办 定时器时间太短不够用怎么办? 考试时间不够用怎么办 感觉时间不够用怎么办 学习时间不够用怎么办 天天时间不够用怎么办 网贷骚扰通讯录怎么办 老被电话骚扰怎么办 对付广场舞噪音怎么办 普法平台考试不及格怎么办 假疫苗事件孩子怎么办 网上办生育证怎么办? 新生儿足跟血筛查没通过怎么办 新生儿听力筛查未通过怎么办 医药代表业绩差怎么办 网站诈骗被骗了怎么办 网贷利息过高怎么办 麦粒肿脓包不破怎么办 处方单丢了怎么办 深圳社保转外省怎么办 单位退休后医保怎么办 鼓楼医院就诊卡怎么办 2017个体户怎么办环评 查环保停工工人怎么办 林地己建房了怎么办 交不起环保罚款怎么办 单位没钱交社保怎么办 单位不缴医保怎么办 公司拖欠工资后注销怎么办 吸入纳米光触媒怎么办 溶解氧过低该怎么办 停水后来水浑浊怎么办 拉菜绿色通行证怎么办 烤箱下火太大怎么办