游戏开发论坛

 找回密码
 立即注册
搜索
查看: 3680|回复: 0

动态修改LPDIRECT3DTEXTURE9纹理数据问题!!

[复制链接]

2

主题

2

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2010-7-22 14:42:00 | 显示全部楼层 |阅读模式

void CD3DImageRendering::ChangeTexturue(HBITMAP hBitmap)
{
        BITMAP bmp;
        GetObject(hBitmap, sizeof(BITMAP), &bmp);

        DWORD  uFHSize = sizeof(BITMAPFILEHEADER);   // 文件头的字节
        DWORD  uIHSize = sizeof(BITMAPINFOHEADER);   // 文件信息字节
        DWORD  uBmpSize = uFHSize + uIHSize + (bmp.bmWidthBytes) * (bmp.bmHeight);// 整个BMP文件字节

        m_nSrcDataSize = uBmpSize;
        m_nWidth       = bmp.bmWidth;
        m_nHeight      = bmp.bmHeight ;

        // 文件信息
        BITMAPINFOHEADER bi;
        ZeroMemory(&bi,sizeof(BITMAPINFOHEADER));
        bi.biSize                    =  uIHSize;  
        bi.biWidth                   =  m_nWidth;  
        bi.biHeight                  =  m_nHeight;  
        bi.biPlanes                  =  1;  
        bi.biBitCount                =  bmp.bmBitsPixel;  
        bi.biCompression             =  BI_RGB;  
        bi.biSizeImage               =  0;  
        bi.biXPelsPerMeter           =  0;  
        bi.biYPelsPerMeter           =  0;  
        bi.biClrImportant            =  0;  
        bi.biClrUsed                 =  0;

        // 文件头
        BITMAPFILEHEADER bmfHdr;
        ZeroMemory(&bmfHdr,sizeof(BITMAPFILEHEADER));
        bmfHdr.bfType  =  0x4D42;  //  "BM"   
        bmfHdr.bfSize  =  uBmpSize;   
        bmfHdr.bfReserved1  =  0;   
        bmfHdr.bfReserved2  =  0;   
        bmfHdr.bfOffBits  = uFHSize  +  uIHSize;

        BYTE *buffer = new BYTE[uBmpSize];
        memcpy( buffer, &bmfHdr, uFHSize);
        memcpy( &buffer[uFHSize], &bi, uIHSize);
        memcpy( &buffer[uFHSize + uIHSize],bmp.bmBits, (uBmpSize - uFHSize - uIHSize));

          //// 这里从内存创建纹理是正确的
            ///LPDIRECT3DTEXTURE9  pTexture = NULL;
           //D3DXCreateTextureFromFileInMemory(g_pd3dDevice, buffer, uBmpSize, &pTexture);



        //// 这里动态修改不正确,是什么原因啊???
        D3DSURFACE_DESC Desc;
          m_pTextrue->GetLevelDesc(0, &Desc);

        D3DLOCKED_RECT lockedRect;
        if(SUCCEEDED(m_pTextrue->LockRect(0, &lockedRect, NULL, D3DLOCK_DISCARD )))
        {

            DWORD*   imageData   =   (DWORD*)lockedRect.pBits;  
            for(int i=0;i<Desc.Height;i++)
             {
                for (int j=0;j<Desc.Width;j++)
                {
                             int  index   =   i *  (lockedRect.Pitch /4) +  j;
                        imageData[index]   =   buffer[index];


                }

              }

             m_pTextrue->UnlockRect(0);
        }

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

本版积分规则

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

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

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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