directx11 - 无法将 Texture2D 设置为 ShaderResourceView?

directx11 - can't set Texture2D as ShaderResourceView?

我写了一点 DirectX RenderEngine,来渲染和纹理简单的多边形。纹理与 CreateDDSTextureFromFile(.dds) 配合得很好。

现在,我尝试从内存缓冲区设置纹理和相应的 ShaderResourceView。创建 Texture2D 可以,但是 CreateShaderResourceView 总是失败。还尝试将第二个参数设置为 NULL 来调用它,但也失败了。整个星期我都在试图弄清楚这里出了什么问题。

我希望有人能在这里帮助我。

[代码]:

    D3D11_TEXTURE2D_DESC tdesc;
ZeroMemory(&tdesc, sizeof(tdesc));
D3D11_SUBRESOURCE_DATA srInitData;
ZeroMemory(&srInitData, sizeof(srInitData));
ID3D11Texture2D* tex = 0;
D3D11_SHADER_RESOURCE_VIEW_DESC srDesc;
ZeroMemory(&srDesc, sizeof(srDesc));

// ------------------------- [CHECK MATE ] ----------------------------
int w = 512;
int h = 512;
int bpp = 4;
int *buf = new int[w*h];

// filling the image
for (int i = 0; i<h; i++)
    for (int j = 0; j<w; j++)
    {
        if ((i & 32) == (j & 32))
            buf[i*w + j] = 0x00000000;
        else
            buf[i*w + j] = 0xffffffff;
    }

// setting up D3D11_SUBRESOURCE_DATA 
srInitData.pSysMem = (void *)buf;
srInitData.SysMemPitch = w*bpp;
srInitData.SysMemSlicePitch = w*h*bpp; // Not needed since this is a 2d texture

// setting up D3D11_TEXTURE2D_DESC 
tdesc.Width = w;
tdesc.Height = h;
tdesc.MipLevels = 1;
tdesc.ArraySize = 1;
tdesc.SampleDesc.Count = 1;
tdesc.SampleDesc.Quality = 0;
tdesc.Usage = D3D11_USAGE_DEFAULT;
tdesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
tdesc.BindFlags = D3D11_BIND_SHADER_RESOURCE;
tdesc.CPUAccessFlags = 0;
tdesc.MiscFlags = 0;

// checking inputs
if (device->CreateTexture2D(&tdesc, &srInitData, NULL) == S_FALSE)
    std::cout << "Inputs correct" << std::endl;
else
    std::cout << "wrong inputs" << std::endl;

// create the texture
if (FAILED(device->CreateTexture2D(&tdesc, &srInitData, &tex)))
{
    std::cout << "Failed" << std::endl;
    return(0);
}
else
    std::cout << "Success" << std::endl;


// setup the Shader Resource Desc.
srDesc.Format = tdesc.Format;
srDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D;
srDesc.Texture2D.MostDetailedMip = 0;
srDesc.Texture2D.MipLevels = 1;

// ------------------ [ Here it always Fails ...]
if (FAILED(device->CreateShaderResourceView(tex, &srDesc, &texture_)));
{
    std::cerr << "Can't create Shader Resource View" << std::endl;
    return false;
}

delete[] buf;

[附带问题]:我注意到当我将 D3D11_TEXTURE2D_DESC.USAGE 更改为 D3D11_USAGE_DYNAMIC 时,CreateTexture2D 也失败了.但是为什么?

[调试]: ... D3D11 信息:创建 ID3D11Buffer:名称="unnamed",地址=0x00C31374,ExtRef=1,IntRef=0 [STATE_CREATION 信息#2097228:CREATE_BUFFER] D3D11 信息:创建 ID3D11Buffer:名称="unnamed",地址=0x00C319A4,ExtRef=1,IntRef=0 [STATE_CREATION 信息#2097228:CREATE_BUFFER] 线程 'Win32 Thread' (0x9c8) 已退出,代码为 0 (0x0)。 D3D11 信息:创建 ID3D11Texture2D:名称="unnamed",地址=0x00C41984,ExtRef=1,IntRef=0 [STATE_CREATION 信息#2097234:CREATE_TEXTURE2D] D3D11 信息:创建 ID3D11ShaderResourceView:名称="unnamed",地址=0x00C41F6C,ExtRef=1,IntRef=0 [STATE_CREATION 信息#2097240:CREATE_SHADERRESOURCEVIEW]

..对我来说不多,在这里看不到任何错误提示。

[注意]:实际上我想使用来自相机输入(存储在缓冲区中)的 RGBA8 纹理 - 但我无法实现。所以我尝试了这个例子,找出为什么 CreateShaderResourceView 即使使用普通的 int* 缓冲区也会失败。

非常感谢您的帮助!谢谢!

[已解决] 如上面的代码,假设 CreateShaderResourceView 失败,我总是达到输出 "Can't create Shader Resource View"。检查 HRESULT,它的值是 S_OK,这对我来说似乎很奇怪。所以我就换个条件试一试:

if (SUCCEEDED(device->CreateShaderResourceView(tex, &srDesc, &texture_)));
{
    std::cout << "Successfully created ShaderResourceView" << std::endl;
    delete[] buf;
    return true;
}
return false;

它奏效了。这种行为对我来说似乎很奇怪,但我终于很高兴它起作用了。因此,相机流现在也可以使用,非常感谢 Adam Miles 的支持! ;)

在设备创建标志上使用 D3D11_CREATE_DEVICE_DEBUG 以在函数失败时打印出准确的错误消息。

这已经晚了很多年,但问题似乎是问题中的代码将被这样解析:

if (FAILED(device->CreateShaderResourceView(tex, &srDesc, &texture_)))
     ;

// unconditionally executed:
{
    std::cerr << "Can't create Shader Resource View" << std::endl;
    return false;
}

由于 if 行末尾的分号。