2013-02-10 155 views
4

我试图通过提供一个rgba值的数组,创建一个ID3D11Texture2D资源与该数组,然后将其映射到我的20 x 20正方形在屏幕上创建一个白色20 x 20像素的正方形。以编程方式创建纹理DirectX

下面是创建方形纹理的代码,并且着色器资源视图:

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; 
} 

但是,我方出现全黑。我已经用File的正常.dds纹理尝试过了,它能工作,但为什么我不能以编程方式创建自己的纹理?我究竟做错了什么?

回答

3

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

DXGI_FORMAT_R8G8B8A8_UNORM 支持每个信道包括α8位的四分量,32位无符号标准化整数格式。

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