我写了一个小DirectX RenderEngine,用来渲染和纹理简单的多边形。CreateDDSTextureFromFile(.dds)的纹理处理效果很好。
现在,我尝试从内存缓冲区中设置一个纹理和相应的ShaderResourceView。创建Texture2D是可行的,但是CreateShaderResourceView总是失败。还试图调用它,将第二个param设置为NULL,也失败。我整个星期都在想这到底是怎么回事。
我希望有人能在这里帮我。
码
D3D11_TEXTURE2D_DESC tdesc;
ZeroMemory(&tdesc, sizeof(tdesc));
D3D11_SUBRESOURCE_DATA srInitData;
ZeroMemory(&srInitData, sizeof(srInitData));
ID3D11Texture2D* tex = 0;
D3D11_SHADER_RESOURCE_VIEW_DESC srDesc;
ZeroMemory(&srDesc, sizeof(srDesc));
// ------------------------- [CHECK MATE ] ----------------------------
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
srInitData.pSysMem = (void *)buf;
srInitData.SysMemPitch = w*bpp;
srInitData.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 (device->CreateTexture2D(&tdesc, &srInitData, NULL) == S_FALSE)
std::cout << "Inputs correct" << std::endl;
else
std::cout << "wrong inputs" << std::endl;
// create the texture
if (FAILED(device->CreateTexture2D(&tdesc, &srInitData, &tex)))
{
std::cout << "Failed" << std::endl;
return(0);
}
else
std::cout << "Success" << std::endl;
// setup the Shader Resource Desc.
srDesc.Format = tdesc.Format;
srDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D;
srDesc.Texture2D.MostDetailedMip = 0;
srDesc.Texture2D.MipLevels = 1;
// ------------------ [ Here it always Fails ...]
if (FAILED(device->CreateShaderResourceView(tex, &srDesc, &texture_)));
{
std::cerr << "Can't create Shader Resource View" << std::endl;
return false;
}
delete[] buf;
侧问题:我注意到当我将D3D11_TEXTURE2D_DESC.USAGE改为D3D11_USAGE_DYNAMIC时,CreateTexture2D也失败了。但是为什么呢?
Debug:D3D11 INFO: Create ID3D11Buffer: Name="unnamed",Addr=0x00C31374,ExtRef=1,IntRef=0 STATE_CREATION INFO #2097228: CREATE_BUFFER D3D11 INFO: Create ID3D11Buffer: Name="unnamed",Addr=0x00C319A4,ExtRef=1,IntRef=0 STATE_CREATION INFO #2097228: CREATE_BUFFER线程'Win32 Thread‘(0x9c8)与代码0 (0x0)共存。D3D11信息:创建ID3D11Texture2D: Name=“未命名”,Addr=0x00C41984,ExtRef=1,IntRef=0 STATE_CREATION INFO #2097234: CREATE_TEXTURE2D D3D11 INFO: Create ID3D11ShaderResourceView: Name="unnamed",Addr=0x00C41F6C,ExtRef=1,IntRef=0 STATE_CREATION INFO #2097240: CREATE_SHADERRESOURCEVIEW
。。对我没什么好说的,在这里看不到任何错误提示。
Note:实际上,我想使用相机输入的RGBA8纹理(存储在缓冲区中),但我无法做到这一点。因此,我尝试了这个例子,以找出为什么即使使用普通的int*缓冲区,CreateShaderResourceView也会失败。
我非常感谢你的帮助!谢谢!
解决了作为上面的代码,我总是达到输出“无法创建CreateShaderResourceView”假设CreateShaderResourceView失败。检查一下HRESULT,它的价值是S_OK,这对我来说似乎很奇怪。所以我改变了条件试了一下:
if (SUCCEEDED(device->CreateShaderResourceView(tex, &srDesc, &texture_)));
{
std::cout << "Successfully created ShaderResourceView" << std::endl;
delete[] buf;
return true;
}
return false;
而且起作用了。这种行为在我看来确实很奇怪,但我终于很高兴它起作用了。因此,相机流现在也可以工作了,非常感谢亚当·迈尔斯的支持!)
发布于 2015-03-28 12:19:57
在设备创建标志上使用D3D11_CREATE_DEVICE_DEBUG,以便在函数失败时得到准确的错误消息。
发布于 2019-07-24 16:12:16
这已经晚了好几年,但问题似乎在于,问题中的代码将被解析成这样:
if (FAILED(device->CreateShaderResourceView(tex, &srDesc, &texture_)))
;
// unconditionally executed:
{
std::cerr << "Can't create Shader Resource View" << std::endl;
return false;
}
由于if
行末尾的分号。
https://stackoverflow.com/questions/29316524
复制相似问题