有关STENCIL制作反射效果的问题

无路不荆棘 2009-08-30 11:28:18
我想根据红龙那本书介绍的镜面效果的实例,制作水面反射效果。在其提供的源程序上修改得到的效果是可以的。如图:

目标像素可以与镜面融合。

但我拿到SIMPLESAMPLE里边时,只是将物体翻转渲染。效果如图:






好像没有进行模板检测,只是没有写入深度缓存,也没有融合。是不是模板检测格式没有设置?

镜面代码如下:

//设置模板检测
device->SetRenderState(D3DRS_STENCILENABLE, true);
device->SetRenderState(D3DRS_STENCILFUNC, D3DCMP_ALWAYS);
device->SetRenderState(D3DRS_STENCILREF, 0x1);
device->SetRenderState(D3DRS_STENCILMASK, 0xffffffff);
device->SetRenderState(D3DRS_STENCILWRITEMASK, 0xffffffff);
device->SetRenderState(D3DRS_STENCILZFAIL, D3DSTENCILOP_KEEP);
device->SetRenderState(D3DRS_STENCILFAIL, D3DSTENCILOP_KEEP);
device->SetRenderState(D3DRS_STENCILPASS, D3DSTENCILOP_REPLACE);

//取消写入深度缓存和后台缓存
device->SetRenderState(D3DRS_ZWRITEENABLE, false);
device->SetRenderState(D3DRS_ALPHABLENDENABLE, false);
device->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_ZERO);
device->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_ONE);

//渲染镜面

device->SetTransform(D3DTS_WORLD,&g_matGround);
device->SetTexture(0, g_pTexture3);
device->SetStreamSource(0, g_pVB3, 0, sizeof(CUSTOMVERTEX));
device->SetFVF(D3DFVF_SeaWave);
device->DrawPrimitive(D3DPT_TRIANGLESTRIP,0, 2);

//重置深度缓冲
device->SetRenderState( D3DRS_ZWRITEENABLE, true );


//仅绘制与镜面重合的反射物体的像素
device->SetRenderState(D3DRS_STENCILFUNC, D3DCMP_EQUAL);
device->SetRenderState(D3DRS_STENCILPASS, D3DSTENCILOP_KEEP);


//以A平面创建反射矩阵
D3DXPLANE plane(0.0f, 1.0f, 0.0f, 1.4f); //平面A,与xz平面平行,高出1.4
D3DXMATRIX R,W,T;
D3DXMatrixReflect(&R, &plane);
D3DXMatrixTranslation(&T,233,6,110);
W=T*R;

//清除深度缓存,混合反射物体与镜面
device->Clear(0, 0, D3DCLEAR_ZBUFFER, 0, 1.0f, 0);
device->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_DESTCOLOR);
device->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_ZERO);

//绘制反射影像物体
device->SetTransform(D3DTS_WORLD, &W);
device->SetMaterial(&TeapotMtrl);
device->SetTexture(0, 0);
device->SetRenderState(D3DRS_CULLMODE, D3DCULL_CW);
Teapot->DrawSubset(0);


// 重置渲染状态
device->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_ONE);
device->SetRenderState(D3DRS_STENCILENABLE,false);
device->SetRenderState(D3DRS_ALPHABLENDENABLE, false);
device->SetRenderState( D3DRS_STENCILENABLE, false);
device->SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW);
...全文
191 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
xingzhe2001 2009-08-31
  • 打赏
  • 举报
回复
我试的效果
xingzhe2001 2009-08-31
  • 打赏
  • 举报
回复
在这个函数里ModifyDeviceSettings
加上

if( pDeviceSettings->ver == DXUT_D3D9_DEVICE )
{
IDirect3D9* pD3D = DXUTGetD3DObject();
if( SUCCEEDED( pD3D->CheckDeviceFormat(
pDeviceSettings->d3d9.AdapterOrdinal, pDeviceSettings->d3d9.DeviceType,
pDeviceSettings->d3d9.AdapterFormat, D3DUSAGE_DEPTHSTENCIL,
D3DRTYPE_SURFACE, D3DFMT_D24S8 ) ) )
{
if( SUCCEEDED( pD3D->CheckDepthStencilMatch(
pDeviceSettings->d3d9.AdapterOrdinal, pDeviceSettings->d3d9.DeviceType,
pDeviceSettings->d3d9.AdapterFormat, pDeviceSettings->d3d9.pp.BackBufferFormat,
D3DFMT_D24S8 ) ) )
{
pDeviceSettings->d3d9.pp.AutoDepthStencilFormat = D3DFMT_D24S8;
}
}
}



关键是这句
pDeviceSettings->d3d9.pp.AutoDepthStencilFormat = D3DFMT_D24S8;
feilinhe 2009-08-31
  • 打赏
  • 举报
回复
D3DFMT_D24X8->D3DFMT_D24S8吧,是带8位模板缓存的
xingzhe2001 2009-08-31
  • 打赏
  • 举报
回复
恭喜
无路不荆棘 2009-08-31
  • 打赏
  • 举报
回复
不用了不用了。。。原来是我没有清楚模板缓存.....谢谢行者 谢谢大家!
无路不荆棘 2009-08-31
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 xingzhe2001 的回复:]
我试的效果
[/Quote]

模板缓存格式可以改了
可是效果还是那个样子

能不能把把你刚才试的程序关键代码贴上,如果还有的话
无路不荆棘 2009-08-30
  • 打赏
  • 举报
回复
是不是我没设置缓存格式的问题?
我程序的好像是D3DFMT_D24X8。是不是不带模板缓存的?
我用的SDK范例里的框架。怎么修改这个格式?
无路不荆棘 2009-08-30
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 xingzhe2001 的回复:]
从没看你把这个设置为true
device->SetRenderState(D3DRS_ALPHABLENDENABLE, false);
怎么可能有混合效果呢

[/Quote]

打开的话 茶壶是半透明的 其他没变化。

范例中的茶壶影子在下边是看不到的。但我的可以看到。

我程序的效果感觉就是把茶壶不写入深度缓存的倒着渲染了一次。模板检测啥的就没起啥作用。
无路不荆棘 2009-08-30
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 zhangci226 的回复:]
你照着例子那样不行吗
[/Quote]

镜像那部分代码我几乎就是拷贝的。不行。
xingzhe2001 2009-08-30
  • 打赏
  • 举报
回复
从没看你把这个设置为true
device->SetRenderState(D3DRS_ALPHABLENDENABLE, false);
怎么可能有混合效果呢
张赐 2009-08-30
  • 打赏
  • 举报
回复
你照着例子那样不行吗
无路不荆棘 2009-08-30
  • 打赏
  • 举报
回复
效果不对。 书上的例子中 茶壶的影子是融合到镜子那个面得。从下边是看不到的。我做的那个效果是看得到的。
我做的那个其实就是把茶壶不写入深度缓存的 倒着渲染了一次。并没有进行模板检测和融合
张赐 2009-08-30
  • 打赏
  • 举报
回复
效果有什么不对吗?

8,305

社区成员

发帖
与我相关
我的任务
社区描述
游戏开发相关内容讨论专区
社区管理员
  • 游戏开发
  • 呆呆敲代码的小Y
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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