游戏开发论坛

 找回密码
 立即注册
搜索
查看: 5933|回复: 7

Direct3D 内部是怎样管理 Z-Buffer 和 Stencil Buffer?

[复制链接]

7

主题

87

帖子

109

积分

注册会员

Rank: 2

积分
109
QQ
发表于 2007-7-24 11:00:00 | 显示全部楼层 |阅读模式
为这个问题搜索很久了,没有什么资料。

设置 Z-Buffer 和 Stencil Buffer 时,有众多格式可选。
选择 D24S8 时,Depth Buffer 和 Stencil Buffer 数据分位保存在同一个表面上,访问甚方便。

疑问在于,选择 D16, D32, D24X8 时,D-Buffer 和 S-Buffer 好象分开保存了,那位高手知道系统保存到哪里了,怎样才能分别访问?尤其是此时的 Stencil 跑到哪里了?

121

主题

2029

帖子

2034

积分

金牌会员

Rank: 6Rank: 6

积分
2034
QQ
发表于 2007-7-24 19:24:00 | 显示全部楼层

Re:Direct3D 内部是怎样管理 Z-Buffer 和 Stencil Buffer?

这个属于Hardware Spec。不关D3D的事情。

7

主题

87

帖子

109

积分

注册会员

Rank: 2

积分
109
QQ
 楼主| 发表于 2007-7-24 21:02:00 | 显示全部楼层

Re:Direct3D 内部是怎样管理 Z-Buffer 和 Stencil Buffer?

  具体实现是与D3D无关,但是,游戏引擎里 RenderTarget 不只一个,每个 Color Surface 都得有相应的Z-Buffer和S-Buffer表面,D3D只有一个 Device.CreateDepthStencilSurface 可创建独立的 Z-Buffer 和 S-Buffer,此时岂不是只能用 D24S8 了?
  关键问题就是如果在 Device.CreateDepthStencilSurface 里使用了 D24S8 之外的格式,如 D16,D32,D24X8,此时的 Stencil 数据如何访问?只有用 RenderToSurface 了吗?

36

主题

1047

帖子

1147

积分

金牌会员

Rank: 6Rank: 6

积分
1147
发表于 2007-7-25 14:48:00 | 显示全部楼层

Re:Direct3D 内部是怎样管理 Z-Buffer 和 Stencil Buffer?

为什么要访问 stencil buffer?stencil buffer 的所有操作都可以通过 state 来设置,没有必要再回读吧?

13

主题

49

帖子

60

积分

注册会员

Rank: 2

积分
60
发表于 2007-7-25 16:07:00 | 显示全部楼层

Re:Direct3D 内部是怎样管理 Z-Buffer 和 Stencil Buffer?

老大d16 d32下根本没有stencil buffer,
正因为如此,很多显卡根本不提供d32,只提供d24s8

7

主题

87

帖子

109

积分

注册会员

Rank: 2

积分
109
QQ
 楼主| 发表于 2007-7-26 10:43:00 | 显示全部楼层

Re:Direct3D 内部是怎样管理 Z-Buffer 和 Stencil Buffer?

原来如此,感谢5楼指点迷津,回答了“尤其是此时的 Stencil 跑到哪里了?”的问题,我设计的系统已经限定只使用D24S8了。5楼的 MSN?

7

主题

87

帖子

109

积分

注册会员

Rank: 2

积分
109
QQ
 楼主| 发表于 2007-7-26 10:55:00 | 显示全部楼层

Re:Direct3D 内部是怎样管理 Z-Buffer 和 Stencil Buffer?

想了一下,设计一个 Struct 解决
struct BackFrame
{
    D3DSurface RTBuffer
    D3DSurface DSBuffer
}
然后用Device.CreateRenderTarget创建RTBuffer,用Device.CreateDepthStencilSurface创建DSBuffer,渲染前设置到Device:
  Device.SetRenderTarget(... RTBuffer...)
    Device.DepthStencilBuffer = DSBuffer
如此以来,可以创建若干渲染结果,并各自保存 Z-Buffer 和 S-Buffer。

不知有没有别的方法...

121

主题

2029

帖子

2034

积分

金牌会员

Rank: 6Rank: 6

积分
2034
QQ
发表于 2007-7-27 19:30:00 | 显示全部楼层

Re:Direct3D 内部是怎样管理 Z-Buffer 和 Stencil Buffer?

从实际情况猜测来看,z buf和s buf有可能放在一起的.
至于为什么没有类似与D32S8,我猜测是考虑对齐问题.当然只是蒙的.狗叔你们要看到了发个话.

ps,s buf好像不可以动手,如果你需要掩码可以考虑用Alpha通道.
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-25 17:15

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表