如何使用dx从内存加载RGB格式纹理?

时间:2014-08-14 02:52:15

标签: c++ directx textures rgb

这是我的尝试

in = cvLoadImage("24bpp_1920x1200_1.bmp", 1);

HRESULT err;
IDirect3DTexture9 * texture = NULL;
///D3DFMT_L8, D3DFMT_R8G8B8
err = D3DXCreateTexture(g_pd3dDevice, in->width, in->height, 1, 0 , D3DFMT_R8G8B8, D3DPOOL_MANAGED, &g_pTexture);
D3DLOCKED_RECT lockRect;
RECT rect;

err = g_pTexture->LockRect(0, &lockRect, NULL, 0);//I have specified the format is RGB, then why does lockRect.Picth = 7680?

memcpy(lockRect.pBits, in->imageData, in->widthStep*in->height);
if(FAILED(g_pTexture->UnlockRect(0))) 
{
    ///
}

无法以RGB格式显示图像。但它可以以灰度或RGBA格式显示图像。

否则,我想在Dx Sdk_june10“。\ DXSDK \ Samples \ InstalledSamples \ Textures”中使用d3d显示高分辨率图像,如显示图像样本。 但是,再次,它无法显示大小超过1920x1200px的图像。

怎么办?

1 个答案:

答案 0 :(得分:0)

要记住两件事:

(1)您需要检查表示支持24-bpp格式的上限。并非每个Direct3D 9设备都支持它。

(2)你必须尊重LockRect返回的音高,所以你需要通过扫描线进行复制扫描,所以你不能只用一个memcpy做整个事情。类似的东西:

BYTE* sptr = in->imageData;
BYTE* dptr = lockRect.pBits;
for( int y = 0; y < in->height; ++y )
{
    memcpy( dptr, sptr, in->widthStep );
    sptr += in->widthStep;
    dptr += lockRect.Pitch;
}

这假定in->widthStep是源图像的间距(以字节为单位),in->widthStep是&lt; = lockRect.Pitch,并且源图像的格式与格式相同Direct3D资源。