请选择 进入手机版 | 继续访问电脑版

开源计算机图形学社区(Open Source Computer Graphics Community) |OpenGPU Forum (2007-2013)| OpenGPU Project

 找回密码
 注册
搜索
查看: 1093|回复: 10

dx9 获得深度surface的数据 [复制链接]

Rank: 13Rank: 13Rank: 13Rank: 13

注册时间
2017-2-6
积分
1136
发表于 2017-11-7 09:34:50 |显示全部楼层
大家好,dx9中,一些可以lock的format的深度surface进行lock的时候,可以获得该surface的数据的指针,然后根据format可以读取出深度值。
那么不可以进行lock的format的surface如何获取他们的数据指针呢?比如说D3DFMT_D16、D3DFMT_D24S8等format的深度surface?

Rank: 24Rank: 24Rank: 24Rank: 24Rank: 24Rank: 24

注册时间
2010-5-6
积分
12313
发表于 2017-11-7 10:23:06 |显示全部楼层
这种事谷歌一下就出来了。
https://www.gamedev.net/forums/t ... amp;comment=4676564

使用道具 举报

Rank: 13Rank: 13Rank: 13Rank: 13

注册时间
2017-2-6
积分
1136
发表于 2017-11-7 15:05:42 |显示全部楼层
fangsunjian 发表于 2017-11-7 10:23
这种事谷歌一下就出来了。
https://www.gamedev.net/forums/topic/576721-directx9-depth-buffer-to-memory ...

一直研究到现在,还是有个问题,获得surface的data指针还是用到了LockRect接口。对于D3DFMT_D16这种unlockable的深度surface即使是在system memory中也copy到了深度数据,照样是无法进行lockrect操作的呀?如何可以读到他的实际数据呢?

对于一些可以lock的formats,如D3DFMT_D32_LOCKABLE,进行lockrect后就获得了指向data的指针,我可以读出这个点处的深度值。但是如果这种format为D3DFMT_D16这种unlockable的,一进行lockrect就报错,怎么读到他的深度值呢?

您再给指点一下呀,还是我没有读懂https://www.gamedev.net/forums/t ... amp;comment=4676564吗?

使用道具 举报

Rank: 16Rank: 16Rank: 16Rank: 16

注册时间
2010-7-23
积分
2983
发表于 2017-11-7 16:56:46 |显示全部楼层
system memory的资源不在显存里,全部直接都是lockable的。。。所谓的lockable是针对default资源来说的。所以理论上应该可以的。
你试过了没?

使用道具 举报

Rank: 13Rank: 13Rank: 13Rank: 13

注册时间
2017-2-6
积分
1136
发表于 2017-11-7 17:17:00 |显示全部楼层
crazii 发表于 2017-11-7 16:56
system memory的资源不在显存里,全部直接都是lockable的。。。所谓的lockable是针对default资源来说的。所 ...

您好,如您所说:
直接LockRect()不行,default资源unlockable的资源无法lock。
那么如何将default的surface拷贝到system memory呢?调用UpdateSurface肯定是行不通的,文档上说不支持depth stencil format。

我试过先CreateOffscreenPlainSurface 建立一个surface,可是第三个参数设为depth format后一直返回错误,不知道为什么?

使用道具 举报

Rank: 24Rank: 24Rank: 24Rank: 24Rank: 24Rank: 24

注册时间
2010-5-6
积分
12313
发表于 2017-11-7 19:13:25 |显示全部楼层
ZBHWMM520 发表于 2017-11-7 17:17
您好,如您所说:
直接LockRect()不行,default资源unlockable的资源无法lock。
那么如何将default的surf ...

OffscreenPlainSurface为什么要深度的format?明明他只是个中介而已,并不需要绑定到设备。

Depth Format:D3DFMT_D32
OffscreenPlainSurface Format:D3DFMT_R32F

Depth Format:D3DFMT_D16
OffscreenPlainSurface Format:D3DFMT_R16F

使用道具 举报

Rank: 13Rank: 13Rank: 13Rank: 13

注册时间
2017-2-6
积分
1136
发表于 2017-11-8 10:22:39 |显示全部楼层
fangsunjian 发表于 2017-11-7 19:13
OffscreenPlainSurface为什么要深度的format?明明他只是个中介而已,并不需要绑定到设备。

Depth Forma ...

多谢,原来如此!format设置为R16F或者R32F就可以了,这样就可以将16位或者32位depth surface拷贝过来了吧?

UpdateSurface肯定是不可了,我试了一下StrecthRect来拷贝,但是返回0x8876086c:
        LPDIRECT3DSURFACE pSurfaceTemp;
        LPDIRECT3DSURFACE pDSurfaceTemp;
        hr = m_pD3D->CreateOffscreenPlainSurface ( texDesc.Width, texDesc.Height, D3DFMT_R16F, D3DPOOL_SYSTEMMEM, &pSurfaceTemp);
        hr = m_pD3D->GetDepthStencilSurface(&pDSurfaceTemp);

        hr = m_pD3D->StretchRect(pDSurfaceTemp,NULL,pSurfaceTemp,NULL,D3DTEXF_NONE);

        hr = pSurfaceTemp->LockRect(&lockedRect, NULL, D3DLOCK_READONLY);
用什么方法可以copy过去呢?

使用道具 举报

Rank: 16Rank: 16Rank: 16Rank: 16

注册时间
2010-7-23
积分
2983
发表于 2017-11-9 13:25:49 |显示全部楼层
ZBHWMM520 发表于 2017-11-7 17:17
您好,如您所说:
直接LockRect()不行,default资源unlockable的资源无法lock。
那么如何将default的surf ...

fangsunjian巨巨的链接里,那个MJP说的,用GetRenderTargetData复制到system memory的surface上,再lock system mem的资源啊。。我以前也是搜的这个链接,可以拿到render target surface的内容,确认是没问题的,depthstencil surface我没试过,但应该也可以。

使用道具 举报

Rank: 13Rank: 13Rank: 13Rank: 13

注册时间
2017-2-6
积分
1136
发表于 2017-11-10 09:25:12 |显示全部楼层
crazii 发表于 2017-11-9 13:25
fangsunjian巨巨的链接里,那个MJP说的,用GetRenderTargetData复制到system memory的surface上,再lock  ...

非常感谢上面的两位的耐心回复。

以后试试,将depth用shader放到RT上,再获取数据。现在有些紧急的任务要做,这个先放一放。

谢谢两位!!

使用道具 举报

Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20

注册时间
2010-3-27
积分
6101
发表于 2017-11-13 13:33:01 |显示全部楼层
自己可以创建个缓冲区来存储场景深度信息。ShadowMap方式的阴影就必须使用灯光视角的深度缓冲区。

使用道具 举报

Rank: 13Rank: 13Rank: 13Rank: 13

注册时间
2017-2-6
积分
1136
发表于 2017-11-15 09:25:20 |显示全部楼层
ljb 发表于 2017-11-13 13:33
自己可以创建个缓冲区来存储场景深度信息。ShadowMap方式的阴影就必须使用灯光视角的深度缓冲区。 ...

非常感谢,之后我研究一下ShadowMap,不懂得地方再向您请教!

使用道具 举报

最近看过此主题的会员

您需要登录后才可以回帖 登录 | 注册

‹‹
我的工具栏

关于我们|手机版|Archiver|开源计算机图形学社区(Open Source Computer Graphics Community) | OpenGPU Project | OpenGPU Forum (2007-2013)

GMT+8, 2017-12-15 02:56 , Processed in 0.054448 second(s), 11 queries .

Powered by Discuz! X2

© 2001-2011 Comsenz Inc.

回顶部