在 DirectX 中创建和使用纹理

2024-04-02

我正在尝试使用代码创建纹理,将其转换为着色器资源视图,然后将其应用到平面,但是我得到的只是一个黑色方块。我尝试使用 msdn 上的示例代码无济于事,还尝试使用 unsigned char 和 float(float 如下所示,因为这就是我需要用于实现我的最终目标的)。

这是尝试创建纹理的代码:

    bool TerrainClass::CreateTexture(ID3D11Device* _device)
{
    ID3D11Texture2D *texture;
    D3D11_TEXTURE2D_DESC tdesc;
    D3D11_SUBRESOURCE_DATA data;

    float *buf = (float *)malloc(m_terrainWidth * m_terrainHeight * 4 * sizeof(float));

    for(int i = 0; i < m_terrainWidth * m_terrainHeight * 4; i++)
        buf[i] = 1.0f;

    data.pSysMem = (void *)buf;
    data.SysMemPitch = m_terrainWidth * 4;
    data.SysMemSlicePitch = m_terrainWidth * m_terrainHeight * 4;

    tdesc.Width = m_terrainWidth;
    tdesc.Height = m_terrainHeight;
    tdesc.MipLevels = 1;
    tdesc.ArraySize = 1;
    tdesc.SampleDesc.Count = 1;
    tdesc.SampleDesc.Quality = 0;
    tdesc.Usage = D3D11_USAGE_DEFAULT;
    tdesc.Format = DXGI_FORMAT_R32G32B32A32_FLOAT;
    tdesc.BindFlags = D3D11_BIND_SHADER_RESOURCE;

    tdesc.CPUAccessFlags = 0;
    tdesc.MiscFlags = 0;

    //attempt to create the 2d texture
    if(FAILED(_device->CreateTexture2D(&tdesc,&data,&texture)))
        return false;

    //assign the texture made from fbm to one of the textures for the terrain
    if(!(m_Textures->ChangeTexture(_device, texture, 2)))
        return false;

    delete[] buf;

    return true;
}

除非我误会,否则应该是白色纹理。然后将纹理传递到该函数的纹理数组中:

bool TextureArrayClass::ChangeTexture(ID3D11Device* _device, ID3D11Texture2D* _texture, int _i)
{
        if(FAILED(_device->CreateShaderResourceView(_texture,NULL, &m_textures[_i])))
        {
            return false;
        }
        return true;
}

这应该将着色器资源视图设置为我刚刚创建的纹理。 所以我完全不知道自己哪里出了问题,有什么想法吗?


data.SysMemPitch应该以字节为单位,所以m_terrainWidth * 4 * sizeof(float)。与相同SysMemSlicePitch但您可以将其设置为零,因为您只需要纹理立方体、体积或数组。您还应该验证D3D_FEATURE_LEVEL http://msdn.microsoft.com/en-us/library/windows/desktop/ff476876%28v=vs.85%29.aspx你正在使用支持运行R32G32B32A32以你使用它的方式(Sample我假设)。通过查看来验证支持这一页 http://msdn.microsoft.com/en-us/library/windows/desktop/ff471324%28v=vs.85%29.aspx或致电CheckFormatSupport http://msdn.microsoft.com/en-us/library/windows/desktop/ff476498%28v=vs.85%29.aspx。如果您的硬件不支持您正在使用的模式,请切换到更广泛支持的格式,例如B8G8R8A8_UNORM(并确保更改您的初始数据以匹配格式布局)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 DirectX 中创建和使用纹理 的相关文章

随机推荐