通过编程创建纹理的DirectX方法

4
我试图通过提供一个rgba值的数组来创建一个白色的20 x 20像素方块并在屏幕上显示它,方法是创建一个ID3D11Texture2D资源,并将其映射到我的20 x 20的方块上。
以下是创建方块纹理和着色器资源视图的代码:
void Square::CreateSquareTexture(float *color)
{
    float *texArray = (float *)malloc(4 * 20 * 20 * sizeof(float));

    for (int i = 0; i < 20 * 20 * 4; i++)
        texArray[i] = 1.0f;

    ID3D11Texture2D *boxTex = 0;

    D3D11_TEXTURE2D_DESC boxTexDesc;
    ZeroMemory(&boxTexDesc, sizeof(D3D11_TEXTURE2D_DESC));
    boxTexDesc.ArraySize = 1;
    boxTexDesc.BindFlags = D3D11_BIND_SHADER_RESOURCE;
    boxTexDesc.CPUAccessFlags = 0;
    boxTexDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
    boxTexDesc.Height = 20;
    boxTexDesc.MipLevels = 1;
    boxTexDesc.MiscFlags = 0;
    boxTexDesc.SampleDesc.Count = 4;
    boxTexDesc.SampleDesc.Quality = m_4xMsaaQuality - 1;
    boxTexDesc.Usage = D3D11_USAGE_DEFAULT;
    boxTexDesc.Width = 20;

    D3D11_SUBRESOURCE_DATA boxTexInitData;
    ZeroMemory(&boxTexInitData, sizeof(D3D11_SUBRESOURCE_DATA));
    boxTexInitData.pSysMem = texArray;

    m_d3dDevice->CreateTexture2D(&boxTexDesc, &boxTexInitData, &boxTex);
    m_d3dDevice->CreateShaderResourceView(boxTex, NULL, &m_d3dSquareSRV);
}

这是我的像素着色器:

Texture2D squareMap : register(t0);
SamplerState samLinear : register(s0);

struct PixelIn
{
    float4 Pos : SV_POSITION;
    float2 Tex : TEXCOORD;
};

float4 main(PixelIn pin) : SV_TARGET
{
    float4 texColor = squareMap.Sample(samLinear, pin.Tex);

    return texColor;
}

但是,我的正方形全部都是黑色的。我已经尝试使用来自文件的普通.dds纹理,并且它可以工作,但是为什么我不能通过编程创建自己的纹理呢?我做错了什么?

1个回答

3

您的纹理数组与指定的格式不匹配。

DXGI_FORMAT_R8G8B8A8_UNORM是一种支持每个通道包括alpha通道的8位的四分量、32位无符号整数格式。

对于texArray,您正在为每个通道传递四个浮点数(请尝试使用unsigned char代替)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接