【问题标题】:D3D11 CreateTexture2D in 32 bit format32 位格式的 D3D11 CreateTexture2D
【发布时间】:2015-01-13 01:25:49
【问题描述】:

令人惊讶的是,尽管我很确定这是一个非常基本的问题,但我在该主题上找不到任何帮助。所以也许这里有人可以帮助我在这方面取得进展。

我正在尝试创建一个 d3d11 纹理,单通道,每像素 32 位。官方文档很有趣(http://msdn.microsoft.com/en-us/library/windows/desktop/ff476521(v=vs.85).aspx),我发现这个例子是四通道每像素 8 位:

ID3D11Texture2D *MakeCheckerboard(ID3D11Device *myDevice)
{
    ID3D11Texture2D *tex;
    D3D11_TEXTURE2D_DESC tdesc;
    D3D11_SUBRESOURCE_DATA tbsd;

    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 
    tbsd.pSysMem = (void *)buf;
    tbsd.SysMemPitch = w*bpp ;
    tbsd.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 ( myDevice->CreateTexture2D(&tdesc, &tbsd, NULL) == S_FALSE )
        std::cout << "Inputs correct" << std::endl;
    else
        std::cout << "wrong inputs" << std::endl;

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

    delete[] buf;

    return(tex);
}

这个例子工作正常,所以输出是:

Inputs correct
Success

那么,如果我稍微修改一下 32 位单声道

ID3D11Texture2D *MakeCheckerboard(ID3D11Device *myDevice)
{
    ID3D11Texture2D *tex;
    D3D11_TEXTURE2D_DESC tdesc;
    D3D11_SUBRESOURCE_DATA tbsd;

    int w = 512;
    int h = 512;
    int bpp = 4;
    int *buf = new int[w*h];

    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;
        }

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

    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_D32_FLOAT;
    tdesc.BindFlags = D3D11_BIND_SHADER_RESOURCE;

    tdesc.CPUAccessFlags = 0;
    tdesc.MiscFlags = 0;

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

    if(FAILED(myDevice->CreateTexture2D(&tdesc,&tbsd,&tex)))
    {
        std::cout << "Failed" << std::endl;
        return(0);
    }
    else
        std::cout << "Sucess" << std::endl;

    delete[] buf;

    return(tex);
}

对应的输出变为

wrong inputs
Failed

所以我猜输入是错误的,但它们对我来说似乎很好,并且文档不是很详细。有人有线索吗?

编辑 - 在 Chuck Walbourn 回答之后

我在这里看到三点:

1.调试层:

感谢您的建议,我阅读了您提供的链接,以及您在 this question here 上的回答,以及此文档 (4),以及此处的最后一段 (5):

msdn.microsoft.com/en-us/library/windows/desktop/jj200584(v=vs.85).aspx

msdn.microsoft.com/en-us/library/windows/desktop/jj863687(v=vs.85).aspx

(由于信誉低,无法发布链接)

对于目前在 Microsoft Visual Studio 2010 或更早版本中使用 D3D11_CREATE_DEVICE_DEBUG 标志开发应用程序的开发人员,请注意对 D3D11CreateDevice 的调用将失败。这是因为 D3D11.1 运行时现在需要 D3D11_1SDKLayers.dll 而不是 D3D11SDKLayers.dll。

我必须使用 VS 2010 进行开发,如果我激活标志 D3D11_CREATE_DEVICE_DEBUG,则调用 D3D11CreateDevice() 不会产生任何错误。但是运行时没有调试信息。所以我对我的电脑进行了研究,发现 dll D3D11_1SDKLayers.dll 丢失了。因此我假设我必须安装 Windows SDK 8.1。

这提出了两个问题,我将尝试回答:

我可以在 Windows 7 PC 上安装 Windows 8.1 SDK 吗?

调试信息应该出现在哪里?在运行时在我的控制台中? (我想这是个愚蠢的问题,但我不得不承认我不是一个真正的程序员,而且对你们来说显然琐碎的事情我猜不适合我......)

编辑:根据

旧版 DirectX SDK(2010 年 6 月)具有适用于 Windows Vista SP2 和 Windows 7 (即 DirectX 11.0)的正确 DirectX 调试运行时

我应该可以使用调试层。但是激活标志并没有使 exe 更加冗长。我正在进一步挖掘。 (我在 Windows 7 上使用带有 DirectX SDK 2010 年 6 月的 mvs 2010,根据 dxdiag 使用 DirectX 11)

编辑:解决方案 好的,所以输出消息确实在 msv 的“输出”面板中可见,而不是在控制台中!这是向前迈出的一大步^^。至此这一点得到解决和关闭。

2。 DXGI_FORMAT_R32_FLOAT 格式:

我不太明白您所说的“initData”是什么意思。我猜你的意思是我正在创建纹理并同时填充它,而我可以使用空的子资源数据并使用UpdateSubresource()。但无论如何我尝试使用DXGI_FORMAT_R32_FLOAT。它似乎工作得很好,因为我没有任何错误,但是纹理是黑色的,或者没有纹理。所以我想它不能正常工作,我需要努力解决这个问题。我希望使用调试层会有所帮助。尽管我很惊讶,因为我再次在运行时没有错误。

编辑:由于调试层现在可以了,我现在确定纹理是使用 Chuck Walbourn 建议正确创建的。好的!但是另一个问题仍然存在:纹理要么是全黑的,要么是全红的。深入挖掘。

编辑:解决方案 问题很简单:每个像素值必须在 0.0 和 1.0 之间浮动。就这样。问题解决了。但随后图像是红色的......

3。 9.2 以上的 Direct3D 功能级别:

我不知道。这对我来说开始是完全陌生的语言。这台 PC 使用的是 NVIDIA Quadro K4000,我会偷偷假设这已经足够了。希望……

编辑:解决方案 显然是这样,所以没关系。

4.想到一个绝望的头脑:

我不是核心程序员,我只是想使用单通道 32 位纹理而不是四通道 32 位纹理,说真的,为什么这么复杂?

【问题讨论】:

    标签: directx-11


    【解决方案1】:

    您应该尝试的第一件事是启用DEBUG device 以查找更详细的诊断信息,因为这可能会告诉您究竟出了什么问题。到参数验证。

    也就是说,问题是您使用的是深度格式DXGI_FORMAT_D32_FLOAT,然后尝试使用不受支持的 initData 对其进行初始化。请改用DXGI_FORMAT_R32_FLOAT

    请注意,DXGI_FORMAT_R32_FLOAT 需要 Direct3D feature level 9.2 或更高版本。

    【讨论】:

    • 感谢您的帮助。我尝试应用您的建议,首先启用调试层。这似乎并不容易,我只是编辑了我的问题以进一步扩展我的进度。
    • 如何“测试”调试层?检查它在这里。
    • OKKKKK 明白了!调试输出 msg 在 msv 的“输出”面板中可见,而不是在控制台中。嗯,先生们,这是一大步!
    • 感谢您的回答,我终于成功设置了所有内容。但是纹理是红色的,正如R32 所建议的那样。所以我的问题仍然存在:我如何获得D32 纹理?有什么想法吗?
    • 这不是格式的问题......它是你的着色器正在做的任何事情。如果您希望将红色通道复制到绿色和蓝色以获得单色渲染,则在从该纹理读取颜色时使用 .rrr
    【解决方案2】:

    我只是发现DXGI_FORMAT_R32G32B32_FLOAT 存在。所以我正在创建一个 r32g32b32 纹理,并且因为我需要一个黑白图像,所以我在每种颜色上使用相同的级别。很简单。

    以下是我的问题中针对此解决方案的示例的偏角:

    ID3D11Texture2D *MakeCheckerboard(ID3D11Device *myDevice)
    {
        ID3D11Texture2D*       tex;
        D3D11_TEXTURE2D_DESC   tdesc;
        D3D11_SUBRESOURCE_DATA tbsd;
    
        int width    = 3;   // three pixel wide
        int height   = 1;   // one pixel height
        int bpp      = 12;
        int nb_color = 3;
    
        // CREATING THE IMAGE
        float* buf[ width * height * nb_color ];
    
        // pixel white
        buf[0] = 1.0f; // red
        buf[1] = 1.0f; // green
        buf[2] = 1.0f; // blue
    
        // pixel black
        buf[3] = 0.0f;
        buf[4] = 0.0f;
        buf[5] = 0.0f;
    
        // pixel white
        buf[6] = 1.0f;
        buf[7] = 1.0f;
        buf[8] = 1.0f;
    
        tbsd.pSysMem          = (void *) buf;
        tbsd.SysMemPitch      = width * bpp ;
        tbsd.SysMemSlicePitch = width * height * bpp ; // Not needed since this is a 2d texture
    
        tdesc.Width              = width;
        tdesc.Height             = height;
        tdesc.MipLevels          = 1;
        tdesc.ArraySize          = 1;
        tdesc.SampleDesc.Count   = 1;
        tdesc.SampleDesc.Quality = 0;
        tdesc.Usage              = D3D11_USAGE_DEFAULT;
        tdesc.Format             = DXGI_FORMAT_R32G32B32_FLOAT;
        tdesc.BindFlags          = D3D11_BIND_SHADER_RESOURCE;
        tdesc.CPUAccessFlags     = 0;
        tdesc.MiscFlags          = 0;
    
    
        if(FAILED(myDevice->CreateTexture2D(&tdesc,&tbsd,&tex)))
            return(0);
    
        delete[] buf;
    
        return(tex);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-22
      • 1970-01-01
      • 2016-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多