2015-01-07 102 views
1

令人惊讶的是,我无法找到任何有关该主题的帮助,尽管我非常确定这是一个相当基本的问题。所以也许有人可以帮助我在这方面取得进展。D3D11 32位格式的CreateTexture2D

我想创建一个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位monochannel

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 

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

编辑 - 后查Walbourn回答

我看到三个点这里:

1.调试层:

谢谢你的建议,我看了你给的链接,以及您的答案this question here和此文档(4)以及此处最后一段(5):

msdn.microsoft.com/en-us/lib郭宝宏/窗/桌面/ jj200584(V = vs.85).ASPX

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

(不能发布,因为低reput链接)

对于目前正致力于在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?

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

编辑:据

遗留的DirectX SDK(2010年6月)有正确的DirectX调试运行时为Windows Vista SP2和Windows 7又名的DirectX 11.0

我应该能够使用调试层。但是激活这个标志并不会让exe变得更加冗长。我正在进一步挖掘。 (我使用MVS 2010与2010年的DirectX SDK月,在Windows 7上,与DirectX 11 acording到输入dxdiag)

编辑:解 好了,所以确实输出味精在MSV的 “输出” 面板可见,不在控制台!这是一大进步^^。因此,这一点是解决和关闭。

2. DXGI_FORMAT_R32_FLOAT格式:

我真的不明白你的 “initData” 的意思。我想你的意思是我正在创建纹理并在同一时间填充它,而我可以使用空的子资源数据并使用UpdateSubresource()。但无论如何,我尝试使用DXGI_FORMAT_R32_FLOAT。它看起来很好,因为我没有任何错误,但纹理是黑色的,或者没有纹理。所以我想这不能正常工作,我需要努力。我希望使用调试层将有所帮助。即使我很惊讶,因为我再次在运行时没有错误。

编辑:由于调试层现在确定,我现在确定使用Chuck Walbourn建议正确创建纹理。好!但是另一个问题仍然存在:纹理是完全黑色的,或者完全是红色的。深层发掘。

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

3的Direct3D功能级别以上9.2:

我不知道。对我来说,这已经成为完全陌生的语言。 PC使用的是NVIDIA Quadro K4000,我只是暗中认为这已经足够了。我希望...

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

4.思想无望的心态:

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

回答

2

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

下面是实施例的在我的这种解决方案的问题偏角:

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

你应该尝试的第一件事是让DEBUG device寻找更详细的诊断为可能会告诉你到底出了什么问题w.r.t.参数验证。

这就是说,问题是你用的是深度格式DXGI_FORMAT_D32_FLOAT,然后试图与不支持initData进行初始化。改为尝试DXGI_FORMAT_R32_FLOAT

注意DXGI_FORMAT_R32_FLOAT需要Direct3D feature level 9。2或更高。

+0

[加1]为[查Walbourn](http://blogs.msdn.com/b/chuckw/) 。 – CodeAngry

+0

感谢您的帮助。我试图应用您的建议,首先启用调试层。这似乎并不容易,我只是编辑了我的问题,以进一步扩展我的进度。 – NoonanRosenblum

+0

如何“测试”调试层?检查它在这里。 – NoonanRosenblum