这是我的尝试
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的图像。
怎么办?
答案 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资源。