有关D3D模板的使用

re-m2 2018-09-14 02:47:19
在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、混合镜子,木箱和地板的纹理后绘制镜子--------------------

还要加上之后的平移矩阵才能得到效果,如代码上的红色字体标出,我不明白为什么这样变,求解
...全文
233 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
mach 2018-09-21
  • 打赏
  • 举报
回复
因为你的镜子在(0,0,3,0),所以如果以你的镜子为摄像机,原来的原点就变换为(0,0,-3,0)了。

456

社区成员

发帖
与我相关
我的任务
社区描述
其它游戏引擎
社区管理员
  • 其它游戏引擎社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧