【问题标题】:Creating Texture with initial data DirectX 11使用初始数据 DirectX 11 创建纹理
【发布时间】: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


【解决方案1】:

一段时间后,我找到了解决问题的方法。我需要添加一行:

srcDesc.MipLevels = 1;

有了这个改变,纹理最终用初始数据创建了

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-28
    • 1970-01-01
    • 2015-07-13
    • 2014-07-12
    • 2018-03-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多