令人惊讶的是,我无法找到任何有关该主题的帮助,尽管我非常确定这是一个相当基本的问题。所以也许有人可以帮助我在这方面取得进展。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