在D3D中利用模板繪制鏡子中的像,但是書上給的解釋不太明白,鏡子本身z坐標為3.0f,而解釋卻說鏡子所在平面在z=-3.0f 。
Vertex vertices[] =
{
//箱子的頂點------------------------------------
……
//后面墻
……
//鏡子
{ XMFLOAT3(-2.0f, 3.0f, 3.0f), XMFLOAT2(2.0f, 0.0f) },
{ XMFLOAT3(2.0f, 3.0f, 3.0f), XMFLOAT2(0.0f, 0.0f) },
{ XMFLOAT3(-2.0f, -1.0f, 3.0f), XMFLOAT2(2.0f, 3.0f) },
{ XMFLOAT3(-2.0f, -1.0f, 3.0f), XMFLOAT2(2.0f, 3.0f) },
{ XMFLOAT3(2.0f, 3.0f, 3.0f), XMFLOAT2(0.0f, 0.0f) },
{ XMFLOAT3(2.0f, -1.0f, 3.0f), XMFLOAT2(0.0f, 3.0f) },
};
………………………………
………………………………
繪制鏡子中的像如下
//----------------------- 2、繪制鏡子模版,這里只填充模板不繪制顏色------------------
world = XMMatrixIdentity();
effect->GetVariableByName("World")->AsMatrix()->SetMatrix((float*)&world); //設定世界坐標系
//禁止寫入顏色并設定模板緩沖狀態
immediateContext->OMSetBlendState(noColorWriteBS,BlendFactor,0xffffffff); //使用NoColorWrite狀態,禁止寫入顏色
immediateContext->OMSetDepthStencilState(markMirrorDSS,0x1); //設定好相應的模板緩沖區狀態
technique->GetPassByIndex(0)->Apply(0,immediateContext);
immediateContext->Draw(6, 54); //繪制鏡子,但是這里只填充模板,不繪制鏡子
//恢復原來設定
immediateContext->OMSetBlendState(NULL,NULL,0xffffffff);
immediateContext->OMSetDepthStencilState(NULL,0x1);
//----------------------- 2、繪制鏡子模版,這里只填充模板不繪制顏色------------------
//----------------------- 3、繪制鏡子中的木箱和地板----------------------------------
XMVECTOR refPlane = XMVectorSet(0.f,0.f,-3.f,0.0f); //鏡子所在平面:[0,0,-3,0]
XMMATRIX Reflect = XMMatrixReflect(refPlane); //通過鏡子反射的坐標
//繪制鏡子中的箱子
//由于反射前順時針順序的頂點在反射后變為逆時針,因此暫時需要讓逆時針為正面來渲染
immediateContext->RSSetState(counterClockFrontRS);
//設定好相應的模板緩沖區狀態
immediateContext->OMSetDepthStencilState(drawReflectionDSS,0x1);
world = XMMatrixIdentity();
world = XMMatrixTranslation(0.0f, 0.0f, -6.0f)* Reflect;
effect->GetVariableByName("World")->AsMatrix()->SetMatrix((float*)&world); //設定世界坐標系
//設定箱子的紋理
effect->GetVariableByName("Texture")->AsShaderResource()->SetResource(textureBox);
technique->GetPassByIndex(0)->Apply(0,immediateContext);
immediateContext->Draw( 36, 0); //繪制鏡子中的箱子
//繪制鏡子中地板
//設定地板的紋理
effect->GetVariableByName("Texture")->AsShaderResource()->SetResource(textureFloor);
technique->GetPassByIndex(0)->Apply(0,immediateContext);
immediateContext->Draw(6, 36); //繪制池子,第二引數表示從頂點陣列第36個(從0開始計算)頂點開始繪制
//恢復狀態
immediateContext->RSSetState(NULL);
immediateContext->OMSetDepthStencilState(NULL,0x1);
//----------------------- 3、繪制鏡子中的木箱和地板----------------------------------
//----------------------- 4、混合鏡子,木箱和地板的紋理后繪制鏡子--------------------
immediateContext->OMSetBlendState(blendStateAlpha, BlendFactor, 0xffffffff); //開啟混合
immediateContext->RSSetState(NoCullRS); //關閉背面消隱
world = XMMatrixIdentity();
effect->GetVariableByName("World")->AsMatrix()->SetMatrix((float*)&world); //設定世界坐標系
effect->GetVariableByName("Texture")->AsShaderResource()->SetResource(textureMirror); //設定鏡子的紋理
technique->GetPassByIndex(0)->Apply(0,immediateContext);
immediateContext->Draw(6, 54); //繪制鏡子,第二引數表示從頂點陣列第36個(從0開始計算)頂點開始繪制
immediateContext->OMSetBlendState(0,0,0xffffffff); //關倍訓合,記住最后必須關倍訓合
immediateContext->RSSetState(0); //恢復背面消隱
//----------------------- 4、混合鏡子,木箱和地板的紋理后繪制鏡子--------------------
還要加上之后的平移矩陣才能得到效果,如代碼上的紅色字體標出,我不明白為什么這樣變,求解
uj5u.com熱心網友回復:
因為你的鏡子在(0,0,3,0),所以如果以你的鏡子為攝像機,原來的原點就變換為(0,0,-3,0)了。轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/49039.html
標籤:其它游戲引擎
上一篇:記錄VMware15.1升級15.5.6找不到msi檔案
下一篇:網路攻擊對運營的風險到底有多重?
