DirectX9纹理显示失真

时间:2014-06-09 12:55:16

标签: c++ drawing video-streaming directx directx-9

出于某种原因,只有有条件D3DPTEXTURECAPS_NONPOW2CONDITIONAL)支持“非幂2”(NONPOW2)纹理的机器我才会遇到这种图像失真:

enter image description here

(在完全支持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数据本身有问题吗?

感谢。

0 个答案:

没有答案