directx11-无法将Texture2D设置为ShaderResourceView吗?

最大限度

我编写了一些DirectX RenderEngine,以渲染和纹理化简单的Polygons。纹理与CreateDDSTextureFromFile(.dds)的配合非常好。

现在,我尝试从“内存”缓冲区中设置一个Texture和一个相应的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也会失败。但为什么?

[Debug]:... D3D11 INFO:创建ID3D11Buffer:名称=“ unnamed”,Addr = 0x00C31374,ExtRef = 1,IntRef = 0 [STATE_CREATION INFO#2097228:CREATE_BUFFER] D3D11 INFO:创建ID3D11Buffer:Name =“ unnamed”, Addr = 0x00C319A4,ExtRef = 1,IntRef = 0 [STATE_CREATION INFO#2097228:CREATE_BUFFER]线程'Win32线程'(0x9c8)已退出,代码为0(0x0)。D3D11 INFO:创建ID3D11Texture2D:Name =“ unnamed”,Addr = 0x00C41984,ExtRef = 1,IntRef = 0 [STATE_CREATION INFO#2097234:CREATE_TEXTURE2D] D3D11 INFO:创建ID3D11ShaderResourceView:Name =“ unnamed”,Addr = 0x00C41F ,IntRef = 0 [STATE_CREATION INFO#2097240:CREATE_SHADERRESOURCEVIEW]

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

[注意]:实际上,我想使用来自Camera Input(存储在缓冲区中)的RGBA8纹理-但我无法实现这一点。因此,我尝试了此示例,以了解即使使用普通的int *缓冲区,CreateShaderResourceView为什么也会失败。

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

[已解决]如上面的代码,假设CreateShaderResourceView失败,我总是会到达输出“无法创建Shader资源视图”。检查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,以获取函数失败时打印出的确切错误消息。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

DirectX11 2窗口渲染

来自分类Dev

DirectX11中Texture2D和Texture2DMS之间的区别

来自分类Dev

DirectX11如何从未签名的char *数据创建Texture2D

来自分类Dev

DirectX:即使我的系统说它支持DirectX11设备,也无法创建它

来自分类Dev

directx11 为 DrawLine 2d 添加发光

来自分类Dev

如何在HLSL DirectX11 C ++中使用Texture2DArray

来自分类Dev

在DirectX11中为动态和静态对象使用单独的顶点缓冲区

来自分类Dev

使用DirectX11时无法访问DirectXMath.h

来自分类Dev

超过DirectX11显存

来自分类Dev

C ++ DirectX11将同一向量中的元素设置为同一更新循环中的不同位置

来自分类Dev

使用DirectX11像素着色器将颜色从DXGI_FORMAT_B8G8R8A8_UNORM转换为GPU中的NV12

来自分类Dev

尝试渲染3D三角形会使Nvidia驱动程序崩溃!为什么?[C ++ && DirectX11 SDK]

来自分类Dev

DirectX11如何加载Obj文件

来自分类Dev

.Obj Faces格式DirectX11

来自分类Dev

Directx11绕世界中心旋转?

来自分类Dev

在DirectX 11 Compute Shader中加载Texture2D数据

来自分类Dev

非交错顶点缓冲区DirectX11

来自分类Dev

WPF中DirectX11中的SharpDX 2.5

来自分类Dev

c ++ Directx11捕获屏幕并保存到文件

来自分类Dev

DirectX11顶点在前面被绘制

来自分类Dev

DirectX11中的纹理流,不可变与动态

来自分类Dev

Directx11是否支持ASTC压缩纹理?

来自分类Dev

DirectX11:从计算着色器读取模具位

来自分类Dev

DirectX11映射/取消映射运行时错误

来自分类Dev

DirectX11 / OpenGL仅渲染一半的纹理

来自分类Dev

使用C ++的Directx11渲染不起作用

来自分类Dev

C ++中的着色器和Directx11编译

来自分类Dev

DirectX11 HLSL着色器未运行

来自分类Dev

编译DirectX11着色器文件

Related 相关文章

热门标签

归档