游戏开发论坛

 找回密码
 立即注册
搜索
查看: 4147|回复: 5

后台缓存,深度缓存,模板缓存

[复制链接]

10

主题

25

帖子

25

积分

注册会员

Rank: 2

积分
25
发表于 2011-8-5 15:31:00 | 显示全部楼层 |阅读模式
模版缓存的分辨率与后缓存和深度缓的分辨率存完全相同,
所以模版缓存的像素与后缓存和深度缓存中的像素是一一对应的。

一种模板缓存的格式:
D3DFMT_D24S8—这种格式是说创建一个32位深度/模版缓存,其中24位为深度缓存,8位为模版缓存。

1.既然24位为深度缓存,8位为模版缓存,那么为什么模版缓存的分辨率与深度缓的分辨率存完全相同?
2.后台缓存里存放的是什么,是每个像素吗?
3.在龙书的8.2.3代码解析第二部中说到:“接下来绘制镜面,把镜面绘制到模板缓存中”,这里我不明白,
既然“8位为模版缓存”,又怎么存喃?
4.后台缓存是不是包含深度缓存,模板缓存?

这三个缓存越看越糊涂,特别是具体的存储,请大家帮我理理吧!!

10

主题

25

帖子

25

积分

注册会员

Rank: 2

积分
25
 楼主| 发表于 2011-8-5 18:36:00 | 显示全部楼层

Re:后台缓存,深度缓存,模板缓存

我又看了下代码,好像理解了,看下对不对:
后台缓存里存放的是像素;
模板缓存和深度缓存共享一块内存快(32位的),前24为给深度缓存,后8为给模板缓存(如果按上述格式的话);
“接下来绘制镜面,把镜面绘制到模板缓存中”,这个其实是做标记,把要绘制镜面的位置对应在模板缓存的位置做上标记;

还有一个分辨率那个还是没搞懂。

0

主题

2

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2011-8-6 00:20:00 | 显示全部楼层

Re:后台缓存,深度缓存,模板缓存

我今天刚刚看了这部分,分辨率一样我倒是理解了,但是缓存的位数没懂,那个不同的缓存感觉跟你一样:后台=深度+模板位数

10

主题

25

帖子

25

积分

注册会员

Rank: 2

积分
25
 楼主| 发表于 2011-8-6 11:29:00 | 显示全部楼层

Re: Re:后台缓存,深度缓存,模板缓存

szmneo: Re:后台缓存,深度缓存,模板缓存

我今天刚刚看了这部分,分辨率一样我倒是理解了,但是缓存的位数没懂,那个不同的缓存感觉跟你一样:后台=深度+模板位数


你给我说先那个分辨率是什么吧?是不是他们的存储格式都是一样的,32位。

0

主题

2

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2011-8-6 23:39:00 | 显示全部楼层

Re: Re: Re:后台缓存,深度缓存,模板缓存

youou003: Re: Re:后台缓存,深度缓存,模板缓存



你给我说先那个分辨率是什么吧?是不是他们的存储格式都是一样的,32位。

分辨率只是说他们的范围大小啊
比如100*100的显示区域,那么他们都是100*100的范围,每一个像素点都对应着这些缓存

1

主题

266

帖子

280

积分

中级会员

Rank: 3Rank: 3

积分
280
发表于 2011-8-15 01:11:00 | 显示全部楼层

Re:后台缓存,深度缓存,模板缓存

1.
分辨率一样是指缓存的像素是一样的分辨率,如都是800*600、1024*768...等等。
他们的每个像素的位深度可以不同。

2.
后缓存里存放的是每个像素的颜色值。

3.
既然你提到龙书,那我就直接讲这个例子:
你说的这次绘制镜子其实是第二次绘制镜子了。因为在之前已经绘制一边镜子、墙壁和地板了(也就是说后缓冲里有这些东西了)。
为什么还要绘制第二遍呢? 就是为了更新模板缓冲。
是这样的,你仔细看看代码,在这次绘制之前已经设置了相关blend运算,让此次绘制不会更改后缓存的值(因为没有必要,后缓存里已经有了)。
重要的是:
    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);//这些代码的解释书中都有
这些代码让所有的“模板测试”都通过,并且通过后将缓存参考值设置为1。这会导致什么?
我们此次绘制了镜子(尽管没有绘制到后缓存上),但是所有绘制的部分在模板缓存相应的位置上的值都变成1了(之前整个模板都是0),这样就等于在模板上“标记”出了镜子所在的位置!!
然后再渲染茶壶时就会按照这些“标记”来绘制,这样除了镜子所在的位置,别处就不会画出茶壶了。

以上这些就是此实例的渲染过程。我觉得你并没有完全明白模板的含义,所以就详细解释了下。

4.
一般说的后缓存(如D3DFMT_A8R8G8B8等)就是储存了相关像素点的颜色(包含alpha值)。
深度缓存指相关像素的Z值。
模板缓存就是刚才说的标记用的那些东西。

后缓存要存颜色和alpha值,所以要用32位这么大,一般都单独使用一个buffer。
而深度缓存只是存Z值,不一定要占用32位这么多。模板用于标记,更是不用这么多位了(上面那个例子中实际只使用了1位)。所以常把深度缓存和模板缓存放在一起(24:8),这样就共用一个32位的buffer。

这三个缓存在逻辑上是三种东西。至于在硬件上是如何安排的,你现在还不用深入考虑这个。你只要知道:设置好一切,D3D会帮你管理好它们的。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-6-8 13:55

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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