出于某种原因,只有有条件(D3DPTEXTURECAPS_NONPOW2CONDITIONAL
)支持“非幂2”(NONPOW2)纹理的机器我才会遇到这种图像失真:
(在完全支持NONPOW2纹理的机器上,一切正常。)
这是1280x720分辨率RGB24(D3DFMT_X8R8G8B8
)。
我知道在处理有条件支持的纹理时有四条规则:
1. 纹理阶段的纹理寻址模式设置为D3DTADDRESS_CLAMP。
mpDevice->SetSamplerState(0, D3DSAMP_ADDRESSU, D3DTADDRESS_CLAMP);
mpDevice->SetSamplerState(0, D3DSAMP_ADDRESSV, D3DTADDRESS_CLAMP);
mpDevice->SetSamplerState(0, D3DSAMP_ADDRESSW, D3DTADDRESS_CLAMP);
2. 禁用纹理阶段的纹理包装(D3DRS_WRAP n设置为0)。
mpDevice->SetRenderState(D3DRS_WRAP0, 0);
3. 未使用Mipmapping(仅使用放大滤镜)。
mpDevice->SetSamplerState(0, D3DSAMP_MIPFILTER, D3DTEXF_NONE);
4. 纹理格式不得为D3DFMT_DXT1至D3DFMT_DXT5。
我正在使用D3DFMT_X8R8G8B8
...
纹理是这样创建的:
mpDevice->CreateTexture(width, height, 1, D3DUSAGE_DYNAMIC, D3DFMT_X8R8G8B8, D3DPOOL_DEFAULT, &pTexture, nullptr);
并像这样更新:
D3DLOCKED_RECT lockedRect;
pTexture->LockRect(0, &lockedRect, nullptr, D3DLOCK_DISCARD);
// const IppiSize roiSize = { width, height };
// ippiCopy_8u_C3AC4R((Ipp8u*) pPixels, width * 3, (Ipp8u*) lockedRect.pBits, width * 4, roiSize); // RGB to RGBA
// ippiCopy_8u_AC4C3R((Ipp8u*) pPixels, width * 4, (Ipp8u*) lockedRect.pBits, width * 3, roiSize); // RGBA to RGB
// TEMP.
unsigned char* pDst = (unsigned char*) lockedRect.pBits;
const unsigned char* pSrc = pPixels;
for (int k = 0; k < width; k++)
{
for (int j = 0; j < height; j++)
{
pDst[0] = pSrc[0];
pDst[1] = pSrc[1];
pDst[2] = pSrc[2];
pDst[3] = 255;
pDst += 4;
pSrc += 3;
}
}
pTexture->UnlockRect(0);
有没有人有类似的问题?或者对发生的事情有任何想法?
可能RGB数据本身有问题吗?
感谢。