Search code examples
c++direct3ddirect3d11

The function CreateWICTextureFromFile() will not actually load a texture (Direct3D11, C++)


I am trying to load a grass texture onto my game with the function DirectX::CreateWICTextureFromFile but everytime I do, the function won't seem to actually load anything, it just loads a black texture. The function successfully returns S_OK, and i've also called the CoInitialize(NULL) before I actually call the function. But it still doesn't work.

Down below is my usage of the function

// 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);

}

What could be wrong here? Why won't the function load the texture?


Solution

  • A quick way to test if you have loaded the texture data correctly is to use SaveWICTextureToFile in the ScreenGrab module right after loading it. You'd only do this for debugging of course.

    #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
    

    Then you can run the code and check that SCREENSHOT.BMP is not all black.

    I strongly suggest you adopt the ComPtr smart pointer and the FAILED / SUCCEEDED macros in your coding style. Raw pointers and directly comparing HRESULT to S_OK is setting yourself up for a lot of bugs.

    You should not call CoInitialize every frame. You should call it once as part of your application's initialization.

    You should not be creating a new instance of SpriteBatch and SpriteFont every frame. Just create them after you create your device and hold on to them.