2015-11-20 2 views
0

Я пытаюсь загрузить текстуру травы в свою игру с помощью функции DirectX::CreateWICTextureFromFile, но каждый раз, когда я это делаю, функция, похоже, ничего не загрузит, он просто загружает черную текстуру. Функция успешно возвращает S_OK, и я также назвал CoInitialize(NULL), прежде чем я на самом деле вызову функцию. Но это все еще не работает.Функция CreateWICTextureFromFile() на самом деле не загружает текстуру (Direct3D11, C++)

вниз ниже мое использование функции

// This is where i load the texture 
void Load_Texture_for_Ground() 
{ 
HRESULT status; 
ID3D11ShaderResourceView * Texture; 

CoInitialize(NULL); 

status = DirectX::CreateWICTextureFromFile(device, L"AmazingGrass.jpg", NULL, &Texture); 

if (Texture != NULL) // This returns true 
{ 
    MessageBox(MainWindow, L"The pointer points to the texture", L"MessageBox", MB_OK); 
} 

if (status == S_OK) //This returns true 
{ 
    MessageBox(MainWindow, L"The function succeeded", L"MessageBox", MB_OK); 
} 

CoUninitialize(); 
} 

// This is where i actually load the texture onto an object, assuming i already declared all the variables in this function 
void DrawTheGround() 
{ 

DevContext->VSSetShader(VS, 0, 0);  

DevContext->PSSetShader(PS, 0, 0); 

DevContext->IASetVertexBuffers(
          0,     
          1,     
          &GroundVertexBuffer, 
          &strides,   
          &offset    
          ); 
DevContext->IASetIndexBuffer(
         IndexBuffer,    
         DXGI_FORMAT_R32_UINT, 
         0 
         ); 

     /* Transforming the matrices*/ 
TransformedMatrix = GroundWorld * CameraView * CameraProjection ; 

Data.WORLDSPACE = XMMatrixTranspose(GroundWorld); 

Data.TRANSFORMEDMATRIX = XMMatrixTranspose(TransformedMatrix); 

     /* Updating the matrix in application's Constant Buffer*/ 
DevContext->UpdateSubresource(
         ConstantBuffer,     
         0,        
         NULL,       
         &Data,       
         0,        
         0        
         ); 

DevContext->VSSetConstantBuffers(0, 1, &ConstantBuffer); 

DevContext->PSSetShaderResources(0, 1, &Texture); 

DevContext->PSSetSamplers(0, 1, &TextureSamplerState); 

DevContext->DrawIndexed(6, 0, 0); 

} 

Что может быть не так? Почему функция не загружает текстуру?

+0

вы должны вызвать CoInitialize (NULL); в начале вашего приложения и CoUninitialize в конце – marcinj

+0

Это все равно не изменит, функция все равно ничего не загружает –

+0

Можете ли вы отправить ссылку на ваш файл jpg? Я хотел бы попытаться воспроизвести вашу проблему. Вы можете показать источник для создания «GroundVertexBuffer». Кроме того, вы должны, как заметки marcinj, вызывать '' CoInitialize'' в начале вашего приложения, а не в начале функции. –

ответ

0

Быстрый способ проверить, правильно ли загружены данные текстуры, использовать SaveWICTextureToFile в модуле ScreenGrab сразу после его загрузки. Конечно, вы сделали это только для отладки.

#include <wincodec.h> 
#include <wrl/cient.h> 
using Microsoft::WRL::ComPtr; 

ComPtr<ID3D11Resource> Res; 
ComPtr<ID3D11ShaderResourceView> Texture; 
HRESULT status = DirectX::CreateWICTextureFromFile(device, L"AmazingGrass.jpg", &Res, &Texture); 

if (FAILED(status)) 
    // Error handling 

#ifdef _DEBUG 
    status = SaveWICTextureToFile(DevContext, Res.Get(), 
       GUID_ContainerFormatBmp, L"SCREENSHOT.BMP"); 
#endif 

Затем вы можете запустить код и убедитесь, что SCREENSHOT.BMP не все черное.

Я настоятельно рекомендую вам принять ComPtr смарт-указатель и FAILED/SUCCEEDED макросы в вашем стиле кодирования. Исходные указатели и прямое сравнение HRESULT с S_OK настраивают себя на множество ошибок.

Вы не должны звонить CoInitialize в каждый кадр. Вы должны вызывать его один раз как часть инициализации вашего приложения.

Вы не должны создавать новый экземпляр SpriteBatch и SpriteFont для каждого кадра. Просто создайте их после создания своего устройства и держитесь за них.

Смежные вопросы