青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

環境反射效果

Posted on 2009-02-11 19:39 Herbert 閱讀(1429) 評論(0)  編輯 收藏 引用 所屬分類: DirectX

  就我所知常用的環境貼圖有兩種,一種是球狀的環境貼圖;一種是立方體的環境貼圖。如果是制作水體的反射或折射效果也可以只做平面的環境貼圖。
  DirectX中提供了一個很方便的立方體環境貼圖。立方體的六個面定義如下:

typedef enum _D3DCUBEMAP_FACES
{
    D3DCUBEMAP_FACE_POSITIVE_X     = 0,
    D3DCUBEMAP_FACE_NEGATIVE_X     = 1,
    D3DCUBEMAP_FACE_POSITIVE_Y     = 2,
    D3DCUBEMAP_FACE_NEGATIVE_Y     = 3,
    D3DCUBEMAP_FACE_POSITIVE_Z     = 4,
    D3DCUBEMAP_FACE_NEGATIVE_Z     = 5,

    D3DCUBEMAP_FACE_FORCE_DWORD    = 0x7fffffff
} D3DCUBEMAP_FACES;


如下圖所示:


   實現原理也很簡單:
   1、把立方體環境貼圖放到反射物體所知位置,并把該反射物體以外的東西映射到立方體環境貼圖上。
   2、根據攝像機到反射物體表面的點的向量a和該點的法向量n,求出a的反射向量b。
   3、以反射向量b作為立方體環境貼圖的尋址,把它所對應的顏色賦給反射物體上的點。

   實現過程需要用到一個立方體環境貼圖和一個深度表面,步驟如下:

   1、定義
    LPDIRECT3DCUBETEXTURE9 m_pReflectCubeTex;  //反射的立方貼圖 
    LPDIRECT3DSURFACE9           m_pSurfDepthCube; // DepthStencilSurface

   2、初始化
    HRESULT hr;

 //創建 DepthStencilSurface
    DXUTDeviceSettings d3dSettings = DXUTGetDeviceSettings();
 hr = pDev->CreateDepthStencilSurface( ENVMAPSIZE,
         ENVMAPSIZE,
         d3dSettings.pp.AutoDepthStencilFormat,
         D3DMULTISAMPLE_NONE,
         0,
         TRUE,
         & m_pSurfDepthCube,
         NULL );
 if( FAILED( hr))
  return hr;

 //創建立方體貼圖
    hr = pDev->CreateCubeTexture( ENVMAPSIZE,
                                        1,
                                        D3DUSAGE_RENDERTARGET,
                                        D3DFMT_A16B16G16R16F,
                                        D3DPOOL_DEFAULT,
                                        & m_pReflectCubeTex,
                                        NULL );
 if( FAILED( hr) )
  return hr;



3、把被反射物體渲染到立方體環境貼圖中

//------------------------------------------------------------
//desc: 渲染反射場景
//param: pDev 設備
//return: 是否創建成功
//------------------------------------------------------------
HRESULT GRenderMaterialProxy::RenderReflectScene(LPDIRECT3DDEVICE9 pDev)
{
 HRESULT hr;

 if( pDev == NULL)
  return E_FAIL;

 LPDIRECT3DSURFACE9 pSufRTBackup; //RenderTarget 備份
 LPDIRECT3DSURFACE9 pSufDSBackup; //DepthStencilSurface 備份

 pDev->GetRenderTarget( 0, & pSufRTBackup);

 if( SUCCEEDED( pDev->GetDepthStencilSurface( & pSufDSBackup) ) )
 {
  pDev->SetDepthStencilSurface( m_pSurfDepthCube);
 }

 //以反射物體為中心,設置視口投影矩陣
 LPDIRECT3DSURFACE9 pSurf;
 D3DXMATRIXA16 mView, mProj;
 D3DXMATRIXA16 mViewDir( * GCameraManager::GetInstance()->GetCamera()->GetViewMatrix() );
 mViewDir._41 = mViewDir._42 = mViewDir._43 = 0.0f;

    D3DXMatrixPerspectiveFovLH( &mProj, D3DX_PI * 0.5f, 1.0f, 0.01f, 10000.0f );

 std::vector< IRenderObject *>::iterator itRenderObj;

 //渲染Cube 6個表面
 for( int iFace = 0; iFace < 6; ++iFace)
 {
  //獲取立方體環境貼圖表面,并設為設備的渲染目標
  //注意:GetCubeMapSurface的第二個參數0表示獲取立方體環境貼圖的表面
  //如果是 n則表示獲取立方體環境貼圖的第n層表面
  V( m_pReflectCubeTex->GetCubeMapSurface( ( D3DCUBEMAP_FACES) iFace, 0, & pSurf));
  V( pDev->SetRenderTarget( 0, pSurf));


  mView = DXUTGetCubeMapViewMatrix( iFace);
  D3DXMatrixMultiply( & mView, & mViewDir, & mView);

  V( pDev->Clear( 0L, NULL, D3DCLEAR_ZBUFFER, 0x000000ff, 1.0f, 0L ));
  
  //渲染被反射物體
  for( itRenderObj = m_vpReflectObjects.begin(); itRenderObj != m_vpReflectObjects.end(); itRenderObj++)
   (*itRenderObj)->Render( pDev, & mView, & mProj);

  SAFE_RELEASE( pSurf);

 }

 if( pSufDSBackup)
 {
  pDev->SetDepthStencilSurface( pSufDSBackup); //恢復深度表面
  SAFE_RELEASE( pSufDSBackup);
 }

 pDev->SetRenderTarget( 0, pSufRTBackup); //恢復渲染目標
 SAFE_RELEASE( pSufRTBackup);

 return S_OK;
}
   

4、根據立方體環境貼圖確定反射物體的顏色(用HLSL實現)

 //渲染環境貼圖
 if( m_bEnableReflect)
  RenderReflectScene( pDev);

 D3DXMATRIXA16 mWorld, mView, mProj, mWorldView;
 CBaseCamera * pCamera = GCameraManager::GetInstance()->GetCamera();
 D3DXVECTOR4 vEyePos = D3DXVECTOR4(* GCameraManager::GetInstance()->GetCamera()->GetEyePt(), 0.0f);
 D3DXMATRIXA16 mEyePos;
 ::D3DXMatrixTranslation( & mEyePos, vEyePos.x, vEyePos.y, vEyePos.z);
 ::D3DXMatrixTranslation( & mWorld, 0.0f, 0.0f, 0.0f);

 mView = * pCamera->GetViewMatrix();
 mProj = * pCamera->GetProjMatrix();

 GVector4 * pLightDirList = G3DSceneManager::GetInstance()->GetLightDirList();
 UINT iLightCount = G3DSceneManager::GetInstance()->GetLightCount();

 //設置變化矩陣
 m_pEffect->SetMatrix("g_mWorld", &mWorld);
 m_pEffect->SetMatrix("g_mProj", &mProj);
 m_pEffect->SetMatrix("g_mView", &mView);

 m_pEffect->SetTexture("g_texReflect", m_pReflectCubeTex); //設置立方體環境貼圖
 m_pEffect->SetFloat("g_fReflectivity", m_fReflectivity); //設置反射率




( fx文件代碼如下)

extern matrix  g_mWorld;
extern matrix  g_mView;
extern matrix  g_mProj;

texture    g_texReflect;

float    g_fReflectivity = 0.9f;

samplerCUBE g_samReflect =
sampler_state
{
 Texture = <g_texReflect>;
 MinFilter = Linear;
 MagFilter = Linear;
 MipFilter = Linear;
};


void VS_Reflect( float4 iPos : POSITION,
 float3 iNor : NORMAL,
 out float4 oPos : POSITION,
 out float3 oEnvTex : TEXCOORD0 )
{
 matrix mWorldView = mul( g_mWorld, g_mView);
 oPos = mul( iPos, mWorldView);
 
 float3 vN = mul( iNor, mWorldView);
 vN = normalize( vN);
 
 float3 vEyeR = -normalize( oPos);
 
 float3 vRef;
 vRef = 2 * dot( vEyeR, vN) * vN - vEyeR;
 //vRef = reflect( vEyeR, vN);
 
 oEnvTex = vRef;
 
 oPos = mul( oPos, g_mProj);
}


float4 PS_Reflect( float3 iTex : TEXCOORD0 ) : COLOR
{
 float4 fColor = texCUBE( g_samReflect, iTex);
 fColor.x = fColor.x * g_fReflectivity;
 fColor.y = fColor.y * g_fReflectivity;
 fColor.z = fColor.z * g_fReflectivity;
 return fColor;  
}

technique Tec_RenderMaterial
{
 pass p0
 {
  vertexShader = compile vs_2_0 VS_Reflect();
  pixelShader = compile ps_2_0 PS_Reflect(); 
 }
}


實現效果如下:

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            av成人天堂| 久久漫画官网| 蜜臀a∨国产成人精品| 亚洲淫片在线视频| 一区二区高清在线观看| 亚洲一区二区三区在线看| 一区二区三区国产盗摄| 亚洲午夜精品| 欧美制服丝袜| 国产精品久久久久高潮| 久久精品理论片| 老巨人导航500精品| 免费在线观看成人av| 欧美日韩三级| 韩国精品在线观看| 亚洲精品视频一区| 午夜视频久久久| 欧美成人官网二区| 亚洲一区二区免费在线| 老司机亚洲精品| 国产精品久久国产三级国电话系列| 国产一区二区三区久久悠悠色av | 久久综合久色欧美综合狠狠| 欧美凹凸一区二区三区视频| 国产精品海角社区在线观看| 激情成人av| 亚洲天堂av高清| 老司机一区二区| av不卡免费看| 男女视频一区二区| 国产精品人人爽人人做我的可爱| 在线观看国产精品网站| 亚洲欧美经典视频| 亚洲国产专区校园欧美| 亚洲欧美色一区| 欧美精品一区二区三区一线天视频| 国产欧美日韩三级| 中文日韩在线视频| 欧美国产视频日韩| 久久精品国产成人| 国产精品试看| 99re国产精品| 免费成人黄色片| 欧美影院久久久| 国产精品欧美日韩一区| 一区二区三区日韩欧美| 亚洲高清不卡av| 久久久www成人免费无遮挡大片 | 亚洲精品视频免费观看| 久久精品女人的天堂av| 国产精品视频一| 亚洲视频碰碰| 亚洲精品久久久久久久久久久久| 久久青草欧美一区二区三区| 国产偷久久久精品专区| 亚洲一区二区三区四区视频 | 久久www免费人成看片高清 | 国产婷婷色一区二区三区| 亚洲私人影院| 国产精品国产一区二区 | 亚洲影视中文字幕| 亚洲精品国产精品乱码不99| 美女亚洲精品| 91久久精品国产91性色| 欧美激情第1页| 欧美成年视频| 亚洲精品美女在线观看| 亚洲国产婷婷| 欧美国产一区二区三区激情无套| 亚洲日本在线视频观看| 亚洲人成在线观看网站高清| 欧美女同在线视频| 亚洲网址在线| 亚洲一区二区三区高清| 国产欧美视频一区二区三区| 久久精品99无色码中文字幕| 午夜精品亚洲一区二区三区嫩草| 国产一区二区欧美| 欧美不卡高清| 欧美国产另类| 亚洲综合久久久久| 午夜精品亚洲| 亚洲欧洲日产国产网站| 一区二区高清在线观看| 国产精品天天看| 美女主播精品视频一二三四| 欧美国产国产综合| 欧美亚洲一区二区在线观看| 欧美一区二区三区视频| 精品电影一区| 91久久精品一区二区三区| 国产精品大片| 老司机精品久久| 欧美日韩国产一区二区| 亚洲男人第一av网站| 久久综合一区二区三区| 亚洲桃色在线一区| 久久精彩免费视频| 亚洲天堂av综合网| 99精品久久| 欧美一区在线直播| 国产精品99久久99久久久二8 | 国产精品乱码妇女bbbb| 免费的成人av| 国产精品久久久久久久久久久久久| 久久这里有精品视频 | 亚洲欧洲精品成人久久奇米网| 99在线热播精品免费99热| 136国产福利精品导航| 亚洲专区欧美专区| 9色精品在线| 久久视频在线免费观看| 午夜在线成人av| 欧美日韩成人免费| 久久综合九色综合久99| 国产精品第一区| 在线成人性视频| 91久久精品网| 国产精品视频内| 91久久精品国产91性色tv| 国产精品一区免费观看| 日韩视频一区二区三区| 激情av一区二区| 性色av香蕉一区二区| 一区二区三区四区国产精品| 女同一区二区| 模特精品裸拍一区| 日韩视频二区| 极品尤物一区二区三区| 亚洲天堂第二页| 在线一区日本视频| 欧美激情成人在线视频| 亚洲第一精品夜夜躁人人爽| 在线观看成人小视频| 欧美中文字幕在线播放| 欧美在线影院在线视频| 国产欧美日韩免费| 欧美亚洲免费高清在线观看| 亚洲欧美另类国产| 国产精品影片在线观看| 亚洲欧美日韩成人| 欧美一区二区三区在线视频| 国产精品看片资源| 亚洲免费在线观看视频| 欧美一区二区视频网站| 国产欧美三级| 欧美与欧洲交xxxx免费观看 | 欧美乱大交xxxxx| 亚洲精品久久久久久久久久久久| 99热这里只有精品8| 欧美日韩综合网| 亚洲一区二区三区在线视频| 欧美在线|欧美| 狠狠色伊人亚洲综合成人| 久久深夜福利| 亚洲欧洲精品一区二区三区 | 久久夜色精品亚洲噜噜国产mv| 国产一区二区三区日韩| 久久乐国产精品| 亚洲日本理论电影| 欧美一区二区三区免费视频| 国产亚洲一二三区| 欧美成人精品福利| 日韩一区二区高清| 欧美在线影院在线视频| 亚洲福利视频二区| 国产精品xxxav免费视频| 欧美一区永久视频免费观看| 亚洲大胆人体视频| 亚洲一区二区三区在线视频| 精品91在线| 欧美三级资源在线| 午夜精品一区二区三区在线| 韩国av一区二区三区| 欧美久久久久久蜜桃| 久久er99精品| 一二三四社区欧美黄| 免费看成人av| 性8sex亚洲区入口| 亚洲美女色禁图| 国产一区二区精品在线观看| 欧美精品 日韩| 亚洲欧美激情一区| 日韩一级片网址| 国产日韩精品视频一区| 欧美成人国产一区二区| 亚洲女人天堂成人av在线| 亚洲福利视频网| 久久精品国产精品| 亚洲视频免费| 亚洲理论电影网| 亚洲福利免费| 国内外成人在线视频| 欧美日韩视频一区二区| 久久综合福利| 久久精品国产亚洲5555| 亚洲视频一区二区| 亚洲精品视频一区| 最新国产乱人伦偷精品免费网站| 久久亚洲国产成人|