環境對映(Environment Mapping)

2021-09-08 21:40:26 字數 2156 閱讀 8051

環境對映是一種用來模擬光滑表面對周圍環境的反射的技術,常見的如鏡子、光亮漆面的金屬等等。

這種技術的實現主要通過將一張帶有周圍環境的貼圖附在所需要表現的多邊形表面來實現的。目前在實時3d遊戲畫面渲染中經常使用的有兩種環境對映。

uv的計算利用球體表面的法線來計算。計算公式如下:

u=nx/2+0.5

v=ny/2+0.5

計算公式中的nx和ny是表面法線的x和y分量,除以2將區間限制在[-0.5,0.5],+0.5將區間調整至uv座標應在的[0,1]區間。在這個公式的計算下,當球體正中表面法線正對攝像機的地方,座標不會有任何扭曲;周圍點依次隨著nx和ny分量的增大而產生扭曲。

球體背面的剔除面可以根據法線z分量的正負來判斷。

具體的取樣方法是利用物體表面的法線來計算的,我們假設動態生成的cubemap的正方體剛剛好包圍住需要產生環境對映效果的物體,我們從攝像機也就是觀察點出發同物體表面產生出的反射向量(同phong光照模型的鏡面反射中的反射向量是相同的,計算方法也相同r=2(e*n)*n-e),這個反射向量同正方體相交於一點,得到了這個點的所在面及uv座標,取樣,得到的顏色值就是我們應當看到。

立方環境對映的原理就是這樣的,但是這些計算步驟並不需要我們在使用的時候過多考慮,因為從cubemap的生成,到取樣的計算,圖形api已經都為我們封裝好了,下面記錄了在directx中簡單的api呼叫流程,權作筆記。

首先需要宣告cubemap的貼圖

lpdirect3dcubetexture9  m_pcubemap = null;

然後建立cubemap貼圖

pd3ddevice->createcubetexture(256,1,d3dusage_rendertarget, d3dfmt_a8r8g8b8,d3dpool_default , &m_pcubemap,null );

注意這裡用到了d3dusage_rendertarget,也就是說我們的cubemap需要靠rendertarget繪製。

如果需要的話,深度緩衝也可以考慮在內。

idirect3dsu***ce9*  g_pdepthcube = null;

dxutdevicesettings d3dsettings = dxutgetdevicesettings();

pd3ddevice->createdepthstencilsu***ce( 256,    256, d3dsettings.pp.autodepthstencilformat,d3dmultisample_none,0,true,&g_pdepthcube,    null );

繪製函式

void rendersceneintocubemap( idirect3ddevice9 *pd3ddevice, double ftime )  

for( int nface = 0; nface < 6; ++nface ) //依次完成cubemap中的六個面的繪製

}  // restore depth-stencil buffer and render target

/*if( pdsold )//如果使用深度緩衝

*/ v( pd3ddevice->setrendertarget( 0, prtold ) );

safe_release( prtold ); }

這個繪製函式

一般在每一幀繪製場景的最開始執行,先將場景內的物體繪製在cubemap上。

這樣我們就有了可用的cubemap,之後我們繪製需要採用環境對映的物體時,將這個cubemap作為texture傳入shader內,另外還需傳入觀察向量用於計算反射向量。 <

br />    在shader中,頂點著色器中完成反射向量的計算:

float3 vecreflect = normalize(reflect(veceye, innormal));

畫素著色器負責取樣,hlsl中已經有現成的函式可以使用,我們只需將計算所得反射向量傳入即可。

output.rgbcolor  = texcube(environmentsampler, in.cubetexcoord);

取樣器environmentsampler並不需要特別的設定。

texture environmentmap;

samplercube environmentsampler = sampler_state

Directx11教程 57 環境對映

建好skydome後,如果我們想讓其中的某個物體,比如那個球體來對映出周圍環境的藍天白雲 不包括自己附近的物體 該怎麼做呢?此時可以把這個球體當成一面鏡子,把我們視點看這個物體上某個頂點p時的反射向量當作cube map查詢向量v,得到紋理texel,然後p點的顏色可以用blend的方式,混合當前顏...

10 1 環境對映的立方體紋理 反射

於 shader 入門精要 其實關鍵的 就三句 1.根據視角方向和法線求出反射反向 o.worldref1 reflect o.worldviewdir,o.worldnormal 2.對 cubemap 進行取樣 fixed3 reflection texcube cubemap,i.worldr...

環境與對映

環境與對映 思考尚淺,目前我只能簡單談兩句我想的概念 環境無處不在,有具體可見可接觸的 如自然環境 和 抽象的 比如文化環境,社會環境 大多數是抽象環境。環境如同領域,如數學,物理,金融等。環境是有著特有類別的集合。環境之間有簡單或複雜的對映關係 什麼是對映?對映是通過物件將乙個環境的資訊傳達到另乙...