2011-03-03 33 views
1

我有D3DX11CreateShaderResourceViewFromMemory幫助函數的問題。D3DX11CreateShaderResourceViewFromMemory爲什麼只上傳紋理的部分副本?

我從文件或ZIP中讀取一些紋理,並將原始字節和長度傳遞給幫助函數,但只有部分紋理上傳(由PIX確認)。 我試着手動調整長度,但無濟於事。 下面是從文件加載紋理的代碼:

struct FileDataLoader 
{ 
    void Load() 
    { 
     std::ifstream file(mFileName); 

     if (file) 
     { 
      file.seekg(0,std::ios::end); 
      std::streampos length = file.tellg(); 
      file.seekg(0,std::ios::beg); 

      mBuffer.resize(length); 
      file.read(&mBuffer[0],length); 
      file.close(); 
     } 
    } 

    void Decompress(void*& data, std::size_t& numBytes) 
    { 
     data = &mBuffer[0]; 
     numBytes = mBuffer.size(); 
    } 

    std::wstring mFileName; 
    std::vector<char> mBuffer; 
}; 

FileDataLoader fdl; 
fdl.mFileName = L"Content\\Textures\\Smoke.dds"; 
fdl.Load(); 
void* bytes; 
std::size_t size; 
fdl.Decompress(bytes, size); 
DXCall(D3DX11CreateShaderResourceViewFromMemory(device, bytes, size, NULL, NULL, &particleTexture, NULL)); 

那只是我使用調試這個問題的一個示例代碼,我把範圍縮小到了文件加載和D3DX的輔助功能。 現在,如果我這樣做,而不是:

DXCall(D3DX11CreateShaderResourceViewFromFileW(device, L"Content\\Textures\\Smoke.dds", NULL, NULL, &particleTexture, NULL)); 

它完美的罰款。

任何想法爲什麼它不會完全上傳紋理?

回答

2

打開文件時,需要指定該文件是二進制的:

std::ifstream file(fileName, std::ios::in | std::ios::binary); 

沒有std::ios::binary標誌你在純文本默認情況下,這不是什麼D3DX11CreateShaderResourceViewFromMemory預計讀書。

+0

嗯,這是一個_old_問題,我已經移動到不同的庫來加載紋理,但是,你確實有一個非常有效的點,這可能是我的問題。 (本來難以用疲憊的眼睛盯着嘿嘿) 所以我會接受你的回答,謝謝你! – 2012-01-13 20:15:22