利用模板缓存绘制镜面效果
2011-03-11 00:42
309 查看
思路:根据镜子的平面和茶壶的位置,计算出茶壶的映像,这时映像有的是在镜子的范围内,有的是在镜子以外的范围上显示。为了只在镜子的范围内显示茶壶,所以在深度缓存中把镜子范围内标记为0x1。然后在值设置为0x1的位置上绘制茶壶。
//1.启用模板缓存,并对相关的绘制状态进行设置
g_d3dDevice->SetRenderState(D3DRS_STENCILENABLE, true); //启用模板缓存
g_d3dDevice->SetRenderState(D3DRS_STENCILFUNC, D3DCMP_ALWAYS); //设置模板测试总会成功
g_d3dDevice->SetRenderState(D3DRS_STENCILREF, 0x1); //修改模板参考值,默认为
g_d3dDevice->SetRenderState(D3DRS_STENCILMASK, 0xffffffff); //模板掩码
g_d3dDevice->SetRenderState(D3DRS_STENCILWRITEMASK, 0xffffffff);
g_d3dDevice->SetRenderState(D3DRS_STENCILZFAIL, D3DSTENCILOP_KEEP); //如果深度测试失败不对模板缓存中的值进行更新
g_d3dDevice->SetRenderState(D3DRS_STENCILFAIL, D3DSTENCILOP_KEEP); //如果模板测试失败不对模板缓存中的值进行更新
g_d3dDevice->SetRenderState(D3DRS_STENCILPASS, D3DSTENCILOP_REPLACE);//如果深度测试和模板测试均通过了则用模板参考值(x1)代替模板缓存中的对应值
//2绘制镜面,只绘制到模板缓存中
g_d3dDevice->SetRenderState(D3DRS_ZWRITEENABLE, false); //阻止深度缓存进行写操作
g_d3dDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, true);
g_d3dDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_ZERO);
g_d3dDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_ONE);
//在模板缓存中绘制镜子
g_d3dDevice->SetStreamSource(0, VB, 0, sizeof(Vertex));
g_d3dDevice->SetFVF(VertexFVF);
g_d3dDevice->SetMaterial(&MirrorMtrl);
g_d3dDevice->SetTexture(0, TexMirror);
D3DXMATRIX
I;
D3DXMatrixIdentity(&I);
g_d3dDevice->SetTransform(D3DTS_WORLD, &I);
g_d3dDevice->DrawPrimitive(D3DPT_TRIANGLELIST, 18, 2);
g_d3dDevice->SetRenderState(D3DRS_ZWRITEENABLE, true);
//3.画茶壶镜像
g_d3dDevice->SetRenderState(D3DRS_STENCILFUNC, D3DCMP_EQUAL);
g_d3dDevice->SetRenderState(D3DRS_STENCILPASS, D3DSTENCILOP_KEEP);
//4.计算场景中为了物体的映像进行定位的映像变换矩阵
//镜像的位置
D3DXMATRIX
W, T, R;
D3DXPLANE
plane(0.0f, 0.0f, 1.0f, 0.0f); //xy平面
D3DXMatrixReflect(&R, &plane);
D3DXMatrixTranslation(&T, TeapotPosition.x, TeapotPosition.y, TeapotPosition.z);
W = T * R;
//5.绘制茶壶的镜像(使显示的映像逼真)
//清楚深度缓存,融合反射的茶壶到镜子中
g_d3dDevice->Clear(0, 0, D3DCLEAR_ZBUFFER, 0, 1.0f, 0);
g_d3dDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_DESTCOLOR);
g_d3dDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_ZERO);
//最终绘制反射茶壶到镜子中
g_d3dDevice->SetTransform(D3DTS_WORLD, &W);
g_d3dDevice->SetMaterial(&TeapotMtrl);
g_d3dDevice->SetTexture(0, 0);
g_d3dDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CW);
TeaPot->DrawSubset(0);
//回复Render设置
g_d3dDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, false);
g_d3dDevice->SetRenderState(D3DRS_STENCILENABLE, false);
g_d3dDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW);
//1.启用模板缓存,并对相关的绘制状态进行设置
g_d3dDevice->SetRenderState(D3DRS_STENCILENABLE, true); //启用模板缓存
g_d3dDevice->SetRenderState(D3DRS_STENCILFUNC, D3DCMP_ALWAYS); //设置模板测试总会成功
g_d3dDevice->SetRenderState(D3DRS_STENCILREF, 0x1); //修改模板参考值,默认为
g_d3dDevice->SetRenderState(D3DRS_STENCILMASK, 0xffffffff); //模板掩码
g_d3dDevice->SetRenderState(D3DRS_STENCILWRITEMASK, 0xffffffff);
g_d3dDevice->SetRenderState(D3DRS_STENCILZFAIL, D3DSTENCILOP_KEEP); //如果深度测试失败不对模板缓存中的值进行更新
g_d3dDevice->SetRenderState(D3DRS_STENCILFAIL, D3DSTENCILOP_KEEP); //如果模板测试失败不对模板缓存中的值进行更新
g_d3dDevice->SetRenderState(D3DRS_STENCILPASS, D3DSTENCILOP_REPLACE);//如果深度测试和模板测试均通过了则用模板参考值(x1)代替模板缓存中的对应值
//2绘制镜面,只绘制到模板缓存中
g_d3dDevice->SetRenderState(D3DRS_ZWRITEENABLE, false); //阻止深度缓存进行写操作
g_d3dDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, true);
g_d3dDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_ZERO);
g_d3dDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_ONE);
//在模板缓存中绘制镜子
g_d3dDevice->SetStreamSource(0, VB, 0, sizeof(Vertex));
g_d3dDevice->SetFVF(VertexFVF);
g_d3dDevice->SetMaterial(&MirrorMtrl);
g_d3dDevice->SetTexture(0, TexMirror);
D3DXMATRIX
I;
D3DXMatrixIdentity(&I);
g_d3dDevice->SetTransform(D3DTS_WORLD, &I);
g_d3dDevice->DrawPrimitive(D3DPT_TRIANGLELIST, 18, 2);
g_d3dDevice->SetRenderState(D3DRS_ZWRITEENABLE, true);
//3.画茶壶镜像
g_d3dDevice->SetRenderState(D3DRS_STENCILFUNC, D3DCMP_EQUAL);
g_d3dDevice->SetRenderState(D3DRS_STENCILPASS, D3DSTENCILOP_KEEP);
//4.计算场景中为了物体的映像进行定位的映像变换矩阵
//镜像的位置
D3DXMATRIX
W, T, R;
D3DXPLANE
plane(0.0f, 0.0f, 1.0f, 0.0f); //xy平面
D3DXMatrixReflect(&R, &plane);
D3DXMatrixTranslation(&T, TeapotPosition.x, TeapotPosition.y, TeapotPosition.z);
W = T * R;
//5.绘制茶壶的镜像(使显示的映像逼真)
//清楚深度缓存,融合反射的茶壶到镜子中
g_d3dDevice->Clear(0, 0, D3DCLEAR_ZBUFFER, 0, 1.0f, 0);
g_d3dDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_DESTCOLOR);
g_d3dDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_ZERO);
//最终绘制反射茶壶到镜子中
g_d3dDevice->SetTransform(D3DTS_WORLD, &W);
g_d3dDevice->SetMaterial(&TeapotMtrl);
g_d3dDevice->SetTexture(0, 0);
g_d3dDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CW);
TeaPot->DrawSubset(0);
//回复Render设置
g_d3dDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, false);
g_d3dDevice->SetRenderState(D3DRS_STENCILENABLE, false);
g_d3dDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW);
相关文章推荐
- DirectX 3D_基础之镜面效果 阴影 阴影矩阵 防止二次融合 网格 子集和属性缓存 绘制子集 网格优化 属性表 邻接信息 克隆 创建网格
- DirectX学习笔记(九):模板缓存与镜面效果实现
- C#利用GDI+绘制旋转文字等效果
- 利用GPU实时绘制水墨画效果
- 利用Swing的Api实现镜面效果
- 利用canvas绘制粒子效果
- 将opengl的绘制效果利用OpenCV、Matlab保存成图片
- Path类:利用PathEffect为路径绘制不同效果
- 【PS】利用中性色绘制高亮光效果
- C#利用GDI+绘制旋转文字等效果实例
- 用模版缓存实现镜面效果
- Direct3D学习手记八:模板技术【镜面效果】
- 在MFC中,利用GDI绘制橡皮筋效果-直线,圆,椭圆,矩形
- 在Android中利用动画效果绘制正弦波
- 如何利用PowerPoint模板制作小球摆动效果
- HTML5利用Canvas绘制图形(使用图像、裁剪区域、使用文本。阴影效果和操作像素)
- 【Hibernate】Hibernate 利用缓存(一级、二级、查询)提高系统性能
- 图像处理之图像纹理添加效果(利用JAVA 2D纹理画笔)
- caffe保存训练log日志文件并利用保存的log文件绘制accuary loss曲线图
- 利用Math.atan2()方法判别方向显示移动的效果