|
|
我用纹理贴一个表面,然后取到跟纹理联系的 表面以装载数据,发现纹理图象宽度发生变化,所以纹理图象显示不正确.请问是什么原因?
这是我的代码:
D3DXCreateTexture(g_pd3dDevice,
160,//width
512,// height
0, // number of mip levels(0 - a complete mipmap chain is created)
0, // usage
D3DFMT_L8,// format
D3DPOOL_MANAGED, // pool(cannot be D3DPOOL_DEFAULT here)
&g_pTexture);
g_pd3dDevice->SetTexture( 0, g_pTexture );
// 上面设定了纹理图象宽度为 160, 高度为 512,
// 但是当我想向纹理图象中 写数据,这样产生变化的纹理图案时候:用下面代码:
LPDIRECT3DSURFACE9 pRenderSurface = NULL;
g_pTexture->GetSurfaceLevel(0, &pRenderSurface); // 纹理对应表面
D3DSURFACE_DESC surfaceDesc;
pRenderSurface->GetDesc(&surfaceDesc);
D3DLOCKED_RECT lockedRect;
pRenderSurface->LockRect(&lockedRect, 0, 0); // entire surface
BYTE* imageData = (BYTE*)lockedRect.pBits;
for(int i = 0; i < surfaceDesc.Height; i++)
{
for(int j = 0; j < surfaceDesc.Width; j++) // 实际测量得到 256? 为什么。不是160?
{
int index = i * lockedRect.Pitch + j; // 实际测量得到 Pitch 是 256,非160。
imageData[index] = // 付实际数据
}
}
pRenderSurface->UnlockRect();
但是发现 整个纹理图象(160*512)被放到 120*512 大小中的左边3/4,而右边并排的1/4是左边重复的内容。
我希望的是 160 *512 整个放到屏幕上。这是什么问题呢/
我发现如果改变数据宽度为 128 或更小,那么就没问题。可是我有这么多数据啊要都显示. 我跟踪发现,表面锁定后宽度实际是 256 不是 160 这是怎么回事?
开始设备设置是:
g_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_SELECTARG1 );
g_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
g_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE );
g_pd3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_DISABLE );
g_pd3dDevice->SetSamplerState(0,D3DSAMP_MAGFILTER,D3DTEXF_LINEAR);
g_pd3dDevice->SetSamplerState(0,D3DSAMP_MINFILTER,D3DTEXF_LINEAR);
g_pd3dDevice->SetSamplerState(0,D3DSAMP_MIPFILTER,D3DTEXF_POINT);
请问原因在哪里?
非常感谢!
|
|