令人驚訝的是,我無法找到任何有關該主題的幫助,儘管我非常確定這是一個相當基本的問題。所以也許有人可以幫助我在這方面取得進展。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位紋理,嚴重的是,爲什麼這麼複雜?
[加1]爲[查Walbourn](http://blogs.msdn.com/b/chuckw/) 。 – CodeAngry
感謝您的幫助。我試圖應用您的建議,首先啓用調試層。這似乎並不容易,我只是編輯了我的問題,以進一步擴展我的進度。 – NoonanRosenblum
如何「測試」調試層?檢查它在這裏。 – NoonanRosenblum