首页 > 解决方案 > 无法设置 TextureWic C++DirectX

问题描述

我正在尝试使用嵌入文件中的纹理,它不是 tga。

这是我的代码,我不知道逻辑错误在哪里。

ID3D11ShaderResourceView* texturePtr = nullptr; 
ID3D11Texture2D* texture2D = nullptr;
ID3D11SamplerState* sampleStatePtr = nullptr;


hr = CoInitialize(NULL);

assert(SUCCEEDED(hr));



devConPtr->PSSetSamplers(0, 1, &sampleStatePtr);
devConPtr->PSSetShaderResources(0, 1, &texturePtr);


Texture2D tex : TEXTURE;
SamplerState mySampler : SAMPLER; 


D3D11_SAMPLER_DESC sd;
ZeroMemory(&sd, sizeof(sd));
sd.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR;
sd.AddressU = D3D11_TEXTURE_ADDRESS_WRAP;
sd.AddressV = D3D11_TEXTURE_ADDRESS_WRAP;
sd.AddressW = D3D11_TEXTURE_ADDRESS_WRAP;
sd.MipLODBias = 0.0f;
sd.MaxLOD = D3D11_FLOAT32_MAX;
sd.ComparisonFunc = D3D11_COMPARISON_NEVER;

hr = devPtr->CreateSamplerState(&sd, &sampleStatePtr);



DXGI_SAMPLE_DESC sample;

sample.Count = 1;
sample.Quality = 0;


D3D11_TEXTURE2D_DESC textureDesc;

textureDesc.Width = w;
textureDesc.Height = h;
textureDesc.MipLevels = 1;
textureDesc.ArraySize = 1;
textureDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
textureDesc.SampleDesc = sample;
textureDesc.Usage = D3D11_USAGE_DEFAULT;
textureDesc.BindFlags = D3D11_BIND_SHADER_RESOURCE;
textureDesc.CPUAccessFlags = D3D11_CPU_ACCESS_READ;
textureDesc.MiscFlags = 0;

D3D11_SUBRESOURCE_DATA subData;

subData.pSysMem = data;
subData.SysMemPitch = sizeof(*data)*w;



HRESULT hr = devPtr->CreateTexture2D(
    &textureDesc,
    &subData,
    &texture2D
);
assert(SUCCEEDED(hr));


//(ID3D11Texture2D*)texture2D;

texturePtr->QueryInterface(IID_ID3D11Texture2D, (void**)&texture2D);


D3D11_SHADER_RESOURCE_VIEW_DESC shvD;

shvD.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
shvD.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D;

hr= devPtr->CreateShaderResourceView(texture2D, &shvD, &texturePtr);

assert(SUCCEEDED(hr));

hr = DirectX::CreateWICTextureFromMemory(devPtr, devConPtr, (const 
uint8_t*)&data, sizeof(*data), 
nullptr, &texturePtr, NULL);

assert(SUCCEEDED(hr));


unsigned int textureCount = mat->GetTextureCount(aiTextureType_UNKNOWN);

    for (UINT j = 0; j < textureCount; j++)
    {

        aiString* path = nullptr;
        mat->GetTexture(aiTextureType_UNKNOWN, j, path);

        assert(path->length >= 2);
        int index = atoi(&path->C_Str()[1]);
        createTexture(scenePtr->mTextures[index]->mWidth, scenePtr- 
>mTextures[index]->mHeight, (uint8_t*)scenePtr->mTextures[index]->pcData);
    }

如果您能找到某种逻辑错误或对调试很有帮助的帮助,我会尝试在我的 HRESULTS 处设置一个断点,但我找不到变量,但它确实表明我的 resourceviewptr 始终为 nullptr,尽管我尝试了使用它。

我正在使用 c++ 和 directx 和 directx 工具包等。

标签: directx

解决方案


您没有shvD完全初始化。要修复它,请像这样初始化它:

D3D11_SHADER_RESOURCE_VIEW_DESC shvD;

shvD.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
shvD.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D;
shvD.Texture2D.MostDetailedMip = 0;
shvD.Texture2D.MipLevels = 1;

推荐阅读