游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2554|回复: 6

surface with D3DFMT_A32B32G32R32F

[复制链接]

414

主题

611

帖子

621

积分

高级会员

Rank: 4

积分
621
发表于 2008-5-11 23:05:00 | 显示全部楼层 |阅读模式
???一下,我如何?取surface with format D3DFMT_A32B32G32R32F的每一??pixel的?色

LPDIRECT3DSURFACE9 pDestSurface_New2;
D3DLOCKED_RECT lrect_New2;
D3DSURFACE_DESC Desc2;

m_pShadowMap_QVSM_Surf_EyeDepth->GetDesc(&Desc2);
V(m_pd3dDevice->CreateOffscreenPlainSurface(Desc2.Width,Desc2.Height,Desc2.Format,D3DPOOL_SYSTEMMEM,&pDestSurface_New2,NULL));//Must be D3DPOOL_SYSTEMMEM for MSDN
V(m_pd3dDevice->GetRenderTargetData(m_pShadowMap_QVSM_Surf_EyeDepth,pDestSurface_New2));

hr=pDestSurface_New2->LockRect(&lrect_New2,NULL,D3DLOCK_NO_DIRTY_UPDATE|D3DLOCK_READONLY );

for (LONG y=0;y<(LONG)Desc.Height;y++)
{
for (LONG x=0;x<(LONG)Desc.Width;x++)
{
float depthFromEye0 = ((float*)lrect_New2.pBits)[y*(lrect_New2.Pitch/(8*sizeof(float)))+x+0];
float depthFromEye1 = ((float*)lrect_New2.pBits)[y*(lrect_New2.Pitch/(8*sizeof(float)))+x+1];
float depthFromEye2 = ((float*)lrect_New2.pBits)[y*(lrect_New2.Pitch/(8*sizeof(float)))+x+2];
float depthFromEye3 = ((float*)lrect_New2.pBits)[y*(lrect_New2.Pitch/(8*sizeof(float)))+x+3];

119

主题

1367

帖子

1393

积分

金牌会员

Rank: 6Rank: 6

积分
1393
发表于 2008-5-11 23:16:00 | 显示全部楼层

Re:surface with D3DFMT_A32B32G32R32F

lock了以后memcpy来的最实在,按字节任何字节都能按你的要求拆分和读取
一个A32B32G32R32四个通道可以划分为4个DWORD分四次memcopy,
不过,这个pixel也有点太夸张了,相当于普通的四层纹理的尺寸。

414

主题

611

帖子

621

积分

高级会员

Rank: 4

积分
621
 楼主| 发表于 2008-5-11 23:32:00 | 显示全部楼层

Re:surface with D3DFMT_A32B32G32R32F

sorry!我是D3DFMT_A32B32G32R32F,不是A32B32G32R32
???一下我要如何?取每??pixel的RGB值?
((float*)lrect_New2.pBits)[y*(lrect_New2.Pitch/(8*sizeof(float)))+x+0];
???算法是否正??

119

主题

1367

帖子

1393

积分

金牌会员

Rank: 6Rank: 6

积分
1393
发表于 2008-5-12 08:27:00 | 显示全部楼层

Re:surface with D3DFMT_A32B32G32R32F

D3DFMT_A32B32G32R32F 116 128-bit float format using 32 bits for the each channel (alpha, blue, green, red).

你看看下面是否合适:

struct PIXEL128F
{
PIXEL128F()
{
  r = 0.0f;
  g = 0.0f;
  b = 0.0f;
  a = 0.0f;
}
float r,
float g,
float b,
float a
}
...
memcpy(&pixel, lpPixelBuffer, 16);
...

414

主题

611

帖子

621

积分

高级会员

Rank: 4

积分
621
 楼主| 发表于 2008-5-13 01:02:00 | 显示全部楼层

Re:surface with D3DFMT_A32B32G32R32F

???一下lpPixelBuffer如何去?算?

119

主题

1367

帖子

1393

积分

金牌会员

Rank: 6Rank: 6

积分
1393
发表于 2008-5-13 08:41:00 | 显示全部楼层

Re:surface with D3DFMT_A32B32G32R32F

你的代码里面的lrect_New2.pBits不就是吗,我代码省略了前后的循环部分,你自己想想嘛。

414

主题

611

帖子

621

积分

高级会员

Rank: 4

积分
621
 楼主| 发表于 2008-5-13 23:55:00 | 显示全部楼层

Re:surface with D3DFMT_A32B32G32R32F

???我解?Q了,感?tonykee的?兔
列出我最?的程式?,大家如果有遇到一?拥???可以?⒖家幌

<1>?於D3DFMT_A32B32G32R32F的?取pixel的程式?如下:

  1.         IDirect3DTexture9 *g_pTexture2;
  2.         D3DXCreateTextureFromFile(g_pD3DDevice, "eyefortest.png", &g_pTexture2);

  3.         HRESULT hr;

  4.         D3DLOCKED_RECT LockedRect;
  5.         D3DSURFACE_DESC Desc;

  6.         hr = g_pTexture2->GetLevelDesc(0,&Desc);//D3DFMT_A32B32G32R32F
  7.         hr = g_pTexture2->LockRect(0,&LockedRect,NULL,0);

  8.         D3DXVECTOR4 *pbits = (D3DXVECTOR4 *) LockedRect.pBits;
  9.         D3DXVECTOR4 vec4;

  10.         //int index=0;

  11.         for (UINT y=0;y<Desc.Height;y++)
  12.         {
  13.                 DWORD dwOffset = y*Desc.Width;
  14.                 for (UINT x=0;x<Desc.Width;x++)
  15.                 {
  16.                         vec4=pbits[dwOffset+x];
  17.                 }
  18.         }

  19.         hr = g_pTexture2->UnlockRect(0);
复制代码


<2>?於D3DFMT_X8R8G8B8的?取pixel的程式?如下:


  1.         HRESULT hr;

  2.         D3DLOCKED_RECT LockedRect;
  3.         D3DSURFACE_DESC Desc;

  4.         hr = g_pTexture->GetLevelDesc(0,&Desc);//D3DFMT_X8R8G8B8
  5.         hr = g_pTexture->LockRect(0,&LockedRect,NULL,0);

  6.         DWORD *pbits = (DWORD *) LockedRect.pBits;

  7.         for (UINT y=0;y<Desc.Height;y++)
  8.         {
  9.                 DWORD dwOffset = y*Desc.Width;
  10.                 for (UINT x=0;x<Desc.Width;x++)
  11.                 {
  12.                         DWORD rgb=pbits[dwOffset+x];

  13.                         DWORD b=LOBYTE(rgb);
  14.                         DWORD g=(LOBYTE(((WORD)(rgb)) >> 8));
  15.                         DWORD r=(LOBYTE((rgb)>>16));
  16.                         DWORD a=(LOBYTE((rgb)>>24));

  17.                         //GetRValue
  18.                         int c=12;
  19.                 }
  20.         }

  21.         hr = g_pTexture->UnlockRect(0);
复制代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-22 12:56

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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