游戏开发论坛

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

从内存数据中生成纹理,内存的数据是个24位的纹理图,

[复制链接]

9

主题

15

帖子

15

积分

新手上路

Rank: 1

积分
15
发表于 2011-8-2 17:08:00 | 显示全部楼层 |阅读模式
    if (FAILED(D3DXCreateTexture(TBDevice::GetDevice(),width,height,1,0,D3DFMT_R8G8B8,D3DPOOL_MANAGED,&m_pTexture)))
    {
        ::MessageBox(0,"创建空白纹理失败","ERROR",0);
        return false;
    }
   
    assert(m_pTexture->GetLevelCount() > 0);
    m_pTexture->GetLevelDesc(0,&m_surfacedesc);
    D3DLOCKED_RECT lockRect;
    if(FAILED(m_pTexture->LockRect(0,&lockRect,NULL,0)))
    {
        ::MessageBox(0,"LockRect失败","ERROR",0);
        return false;
    }
    memcpy(lockRect.pBits,pSrcData,dataSize);
    m_pTexture->UnlockRect(0);
原来的图(试试外链图):

生成的纹理图却是:

60

主题

1319

帖子

1319

积分

金牌会员

Rank: 6Rank: 6

积分
1319
发表于 2011-8-2 19:44:00 | 显示全部楼层

Re:从内存数据中生成纹理,内存的数据是个24位的纹理图

看看lockRect.Pitch的值是width*3还是width*4,如果是width*4,说明创建的纹理存储方式是X8R8G8B8,
另外pSrcData是什么数据,还得注意字节序是不是一致

9

主题

15

帖子

15

积分

新手上路

Rank: 1

积分
15
 楼主| 发表于 2011-8-2 22:40:00 | 显示全部楼层

Re: Re:从内存数据中生成纹理,内存的数据是个24位的纹理

ljm: Re:从内存数据中生成纹理,内存的数据是个24位的纹理图,我读取出来却是不是原来的纹理图。

看看lockRect.Pitch的值是width*3还是width*4,如果是width*4,说明创建的纹理存储方式是X8R8G8B8,
另外pSrcData是什么数据,还得注意字节序是不是一致

谢谢,width*3.我传递的数是width*height*bpp/8;psrcData是没有头信息的位图数据,很奇怪的是,创建纹理时我选择A8R8G8B8和R8G8B8,对产生的纹理都没有影响。我再看看代码,痛苦中。

180

主题

3511

帖子

3520

积分

论坛元老

Rank: 8Rank: 8

积分
3520
发表于 2011-8-2 22:43:00 | 显示全部楼层

Re:从内存数据中生成纹理,内存的数据是个24位的纹理图

我不会 D3D
不过我可以帮LZ分析分析


这个图片下面是黑带,上面部分是某些图片信息。
图片信息部分的高度是 192,而整个图片的尺寸是 256x256
就是说,整个图片的 192/256 是有数据的,其余的 64/256 部分内容是 “0”。

192/256 = 3/4

把24位的RGB图片内容,复制给32位的RGBA贴图内存,只不过没有准确地把 A位跳过而导致的。

9

主题

15

帖子

15

积分

新手上路

Rank: 1

积分
15
 楼主| 发表于 2011-8-2 23:20:00 | 显示全部楼层

Re: Re:从内存数据中生成纹理,内存的数据是个24位的纹理

snhun: Re:从内存数据中生成纹理,内存的数据是个24位的纹理图,我读取出来却是不是原来的纹理图。

我不会 D3D
不过我可以帮LZ分析分析

[img]http://img2081.poco.cn/mypoco/myphoto/20110802/16/5653320...

谢谢你的提示,确实如此,我用CreateTexture不用D3DXCreateTexture函数时,用纹理D3DFMT_R8G8B8创建不了纹理,所以应该是D3DXCreateTexture自动把纹理转为32位了,百度下,确实D3DFMT_R8G8B8不少硬件不支持。
把24位转为32位
        UCHAR * ucpTempData = NULL;
        ucpTempData = (UCHAR *)lockRect.pBits;
        UCHAR * ucpData = (UCHAR *)pSrcData;
        int i = 0;
        for(int j = 0; j < dataSize*4/3; j+=4)
        {
                ucpTempData[j] = (UCHAR)ucpData;
                ucpTempData[j+1]= (UCHAR )ucpData[i+1];
                ucpTempData[j+2] = (UCHAR)ucpData[i+2];
                ucpTempData[j+3] = 0;
                i+=3;
        }
本来以为存放格式是XRGB,结果是RGBX。

180

主题

3511

帖子

3520

积分

论坛元老

Rank: 8Rank: 8

积分
3520
发表于 2011-8-3 01:17:00 | 显示全部楼层

Re: Re: Re:从内存数据中生成纹理,内存的数据是个24位的

xfate: Re: Re:从内存数据中生成纹理,内存的数据是个24位的纹理图,我读取出来却是不是原来的纹理图。
int i = 0;
for(int j = 0; j < dataSize*4/3; j+=4)
{
ucpTempData[j] = (UCHAR)ucpData;
ucpTempData[j+1]= (UCHAR )ucpData[i+1];
ucpTempData[j+2] = (UCHAR)ucpData[i+2];
ucpTempData[j+3] = 0;
i+=3;
}

for(int n = 0; n < dataSize/3; n++)
{
ucpTempData[4n] = (UCHAR)ucpData[3n];
ucpTempData[4n+1]= (UCHAR )ucpData[3n+1];
ucpTempData[4n+2] = (UCHAR)ucpData[3n+2];
}

60

主题

1319

帖子

1319

积分

金牌会员

Rank: 6Rank: 6

积分
1319
发表于 2011-8-3 13:07:00 | 显示全部楼层

Re:从内存数据中生成纹理,内存的数据是个24位的纹理图



  1. UCHAR* pTempLine = (UCHAR*)lockRect.pBits;
  2. UCHAR* pSrcLine = (UCHAR*)pSrcData;
  3. for (int y = 0; y < height; y++)
  4. {
  5.   UCHAR* pTemp = pTempLine;
  6.   UCHAR* pSrc = pSrcLine;
  7.   for (int x = 0; x < width; x++)
  8.   {
  9.     *pTemp++ = *pSrc++; // Blue
  10.     *pTemp++ = *pSrc++; // Green
  11.     *pTemp++ = *pSrc++; // Red
  12.     *pTemp++ = 0xFF; // Alpha
  13.   }
  14.   pTempLine += lockRect.Pitch;
  15.   pSrcLine += width * 3;
  16. }

复制代码

60

主题

1319

帖子

1319

积分

金牌会员

Rank: 6Rank: 6

积分
1319
发表于 2011-8-3 13:14:00 | 显示全部楼层

Re:从内存数据中生成纹理,内存的数据是个24位的纹理图

倒给弄长了,简化一下


  1. UCHAR* pTempLine = (UCHAR*)lockRect.pBits;
  2. UCHAR* pSrc = (UCHAR*)pSrcData;
  3. for (int y = 0; y < height; y++)
  4. {
  5.   UCHAR* pTemp = pTempLine;
  6.   for (int x = 0; x < width; x++)
  7.   {
  8.     *pTemp++ = *pSrc++; // Blue
  9.     *pTemp++ = *pSrc++; // Green
  10.     *pTemp++ = *pSrc++; // Red
  11.     *pTemp++ = 0xFF; // Alpha
  12.   }
  13.   pTempLine += lockRect.Pitch;
  14. }

复制代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-6-8 12:54

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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