2015-01-07 68 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