【问题标题】:DX11 created textures are whiteDX11 创建的纹理是白色的
【发布时间】:2013-08-24 19:44:40
【问题描述】:

我正在尝试加载一个基本纹理 (1024x1024) 并用纯色填充它:

unsigned char *texArray = (unsigned char *)malloc(4 * 1024 * 1024 * sizeof(unsigned char));

for (int i = 0; i < 1024 * 1024 * 4; i++) {
    texArray[i] = (unsigned char)125;
}

D3D11_TEXTURE2D_DESC desc;
desc.Width = 1024;
desc.Height = 1024;
desc.MipLevels = desc.ArraySize = 1;
desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
desc.SampleDesc.Count = 1;
desc.Usage = D3D11_USAGE_DYNAMIC;
desc.BindFlags = D3D11_BIND_SHADER_RESOURCE;
desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
desc.MiscFlags = 0;

ID3D11Texture2D *pTexture = NULL;

D3D11_SUBRESOURCE_DATA TexInitData;
ZeroMemory(&TexInitData, sizeof(D3D11_SUBRESOURCE_DATA));
TexInitData.pSysMem = texArray;
TexInitData.SysMemPitch = static_cast<UINT>( 1024*4 );
TexInitData.SysMemSlicePitch = static_cast<UINT>( 4 * 1024 * 1024 * sizeof(unsigned char) );

GraphicsBase.DXDevice->CreateTexture2D( &desc, &TexInitData, &pTexture );
GraphicsBase.DXDevice->CreateShaderResourceView(pTexture, NULL, &DXTextureContent);

当我使用DXTextureContent 时,我的纹理看起来都是白色的。我用 125/125/125/125 为 RGBA 填充纹理。我在这里有什么遗漏吗?

【问题讨论】:

  • @AaronHagan 谢谢,我已经更新了代码(不是问题)。

标签: windows-phone-8 directx directx-11


【解决方案1】:

您应该始终使用在设备创建时设置的D3D11_CREATE_DEVICE_DEBUG 标志来开发 DX11 应用程序。

有了它,每个 D3D 调用都尽可能详细,并且您的 CreateTexture2D 将在此处失败并返回无效参数错误代码。

D3D11 引入了一些类助手来初始化资源描述,使用CD3D11_TEXTURE2D_DESC,保证没有未初始化的成员。

【讨论】:

  • 谢谢,很有帮助。
【解决方案2】:

一开始你还没有设置 TexInitData 的 SysMemPitch。间距 0 可能不是您所追求的,可能可能会影响它填充纹理的方式。您可能希望将此成员设置为 (1024 * 4)。

【讨论】:

  • 你好 Adam,我已经更新了我的代码以包含 PitchSlicePitch,看起来纹理仍然是白色的。
  • 你好 Adam,经过进一步调查,我发现 desc.SampleDesc.Quality 没有设置,所以我会得到数十亿的随机值。将desc.SampleDesc.Quality 设置为 0 后,它起作用了!
  • 啊,是的,没发现那个,很高兴你发现了。尽管除了 0 之外的 SampleDesc.Quality 的某些值是有效的,但如果调试层对此没有任何意见,我会感到惊讶,如果您还没有在调试版本中打开它,请确保您始终在运行时打开它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-05-19
  • 2016-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多