軟體光 計算

來源:互聯網
上載者:User

 

代碼

D3DXCOLOR SceneLightMgr::calDirectionalLight (D3DXVECTOR3 /*f3VerPos*/, D3DXVECTOR3 f3Normal, D3DXVECTOR3 f3LightDir, 
                                                D3DXCOLOR f4LightColor)
{
  D3DXCOLOR f4OutCol (0, 0, 0, 1);

  D3DXVec3Normalize (&f3LightDir, &f3LightDir);

  D3DXVECTOR3 InvDir = - f3LightDir;
  float f0 = D3DXVec3Dot (&f3Normal, &InvDir);
  if (f0 >= 0)
    f4OutCol = f0 * f4LightColor;

  f4OutCol.a = 1;
  return f4OutCol;
}

D3DXCOLOR SceneLightMgr::calPointLight (D3DXVECTOR3 f3VerPos, D3DXVECTOR3 f3Normal, D3DXVECTOR3 f3LightPos, D3DXCOLOR f4LightColor, 
                                          float fRange, D3DXVECTOR3 f3Attenuation)
{
  D3DXCOLOR f4OutCol (0, 0, 0, 1);
  D3DXVECTOR3 f3LightVec = f3LightPos - f3VerPos;

  float fRadius = D3DXVec3Length (&f3LightVec);
  
  if (fRadius <= fRange)
  {
    D3DXVec3Normalize (&f3LightVec, &f3LightVec);
    
    float f0 = D3DXVec3Dot (&f3Normal, &f3LightVec);
    float fAtten = 1;

    if (f0 >= 0)
    {
      fAtten = 1 - pow (fRadius / fRange, f3Attenuation.x);
      //fAtten = 1.f/(f3Attenuation.x + f3Attenuation.y*fRadius + f3Attenuation.z*fRadius*fRadius);
      
      if (fAtten < 0) 
        fAtten = 0;
      if (fAtten > 1)
        fAtten = 1;

      f4OutCol = f0 * f4LightColor * fAtten;
    }
  }

  f4OutCol.a = 1;
  return f4OutCol;
}

D3DXCOLOR SceneLightMgr::calSpotLight (D3DXVECTOR3 f3VerPos, D3DXVECTOR3 f3Normal, D3DXVECTOR3 f3LightPos, D3DXVECTOR3 f3LightDir, 
                                         D3DXCOLOR f4LightColor, float fRange, D3DXVECTOR3 f3Attenuation, float fFalloff, 
                                         float fTheta, float fPhi)
{
  D3DXCOLOR f4OutCol (0, 0, 0, 1);
  D3DXVECTOR3 f3LightVec = f3LightPos - f3VerPos;

  float fRadius = D3DXVec3Length (&f3LightVec);

  if (fRadius <= fRange)
  {
    D3DXVec3Normalize (&f3LightVec, &f3LightVec);
    D3DXVec3Normalize (&f3LightDir, &f3LightDir);

    float f0 = D3DXVec3Dot (&f3Normal, &f3LightVec);
    float fAtten = 1;

    if (f0 >= 0)
    {
   D3DXVECTOR3 InvLightVec = -f3LightVec;
      float fRho = D3DXVec3Dot (&InvLightVec, &f3LightDir);//dot (-f3LitVec, normalize(f3LightDir));
      float fCosTheta = cosf (fTheta/2);
      float fCosPhi = cosf (fPhi/2);

      if (fRho > fCosTheta)
        fAtten = 1;
      else if (fRho < fCosPhi)
        fAtten = 0;
      else
      {
        fAtten = pow((fRho - fCosPhi)/(fCosTheta - fCosPhi), fFalloff);
        
        if (fAtten < 0) 
          fAtten = 0;
        if (fAtten > 1)
          fAtten = 1;
      }

      fAtten *= 1 - pow (fRadius / fRange, f3Attenuation.x);
      //fAtten *= 1.f/(f3Attenuation.x + f3Attenuation.y*fRadius + f3Attenuation.z*fRadius*fRadius);

      if (fAtten < 0) 
        fAtten = 0;
      if (fAtten > 1)
        fAtten = 1;

      f4OutCol = f0 * f4LightColor * fAtten;
    }
  }

  f4OutCol.a = 1;
  return f4OutCol;
}

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.