【发布时间】:2020-06-29 14:48:12
【问题描述】:
我正在尝试在基于 DirectX 11 的应用中实现可变速率着色。
我是这样做的:
UINT dwRtWidth = 2560;
UINT dwRtHeight = 1440;
D3D11_TEXTURE2D_DESC srcDesc;
ZeroMemory(&srcDesc, sizeof(srcDesc));
int sri_w = dwRtWidth / NV_VARIABLE_PIXEL_SHADING_TILE_WIDTH;
int sri_h = dwRtHeight / NV_VARIABLE_PIXEL_SHADING_TILE_HEIGHT;
srcDesc.Width = sri_w;
srcDesc.Height = sri_h;
srcDesc.ArraySize = 1;
srcDesc.Format = DXGI_FORMAT_R8_UINT;
srcDesc.SampleDesc.Count = 1;
srcDesc.SampleDesc.Quality = 0;
srcDesc.Usage = D3D11_USAGE_DEFAULT; //Optional
srcDesc.BindFlags = D3D11_BIND_SHADER_RESOURCE; //Optional
srcDesc.CPUAccessFlags = 0;
srcDesc.MiscFlags = 0;
D3D11_SUBRESOURCE_DATA initialData;
UINT* data = (UINT*)malloc(sri_w * sri_h * sizeof(UINT));
for (int i = 0; i < sri_w * sri_h; i++)
data[i] = (UINT)0;
initialData.pSysMem = data;
initialData.SysMemPitch = sri_w;
//initialData.SysMemSlicePitch = 0;
HRESULT hr = s_device->CreateTexture2D(&srcDesc, &initialData, &pShadingRateSurface);
if (FAILED(hr))
{
LOG("Texture not created");
LOG(std::system_category().message(hr));
}
else
LOG("Texture created");
当我尝试使用初始数据创建纹理时,它没有被创建并且 HRESULTS 给出消息:“参数不正确”。没说是哪一个。
当我创建没有初始数据的纹理时,它已成功创建。
初始数据有什么问题?我也尝试使用 unsigned char 而不是 UINT,因为它有 8 位,但结果是一样的,没有创建纹理。
请帮忙。
【问题讨论】:
-
initialData 未完全初始化,分配给 SysMemPitch 字段的值似乎是错误的。它应该是纹理的一行开头到下一行的距离(以字节为单位)。
-
这不是问题。我之前使用它与具有 8 位 -> 1 字节的 unsigned char 一起使用。在这种情况下 sri_w 给出了正确的值。
标签: directx textures directx-11 texture2d