传递HLSL C ++时,常量缓冲区为空

时间:2015-06-09 20:43:13

标签: c++ directx shader hlsl

所以我从这个问题:Previous problem转移到了这个问题:)。

我在C ++中制作了两个常量缓冲区,我将其传递给我的HLSL着色器,但是当我调试并查看缓冲区时,除了最后3个数字(-572662307)之外,它们只用零填充。 我正在关注此示例https://msdn.microsoft.com/en-us/library/windows/desktop/ff476896(v=vs.85).aspx

这是我用来创建缓冲区的代码。

    // Define the constant data used to communicate with shaders.
__declspec(align(4)) struct GS_CONSTANT_BUFFER_EDGETABLE
{
    int edgeTable[256];
};
__declspec(align(4)) struct GS_CONSTANT_BUFFER_TRITABLE
{
    int triTable[256][16];
};

// Supply the gs constant data.
GS_CONSTANT_BUFFER_EDGETABLE GsConstDataEdge;
GS_CONSTANT_BUFFER_TRITABLE GsConstDataTri;
for (int i = 0; i < 256; ++i)
{
    GsConstDataEdge.edgeTable[i] = edgeTable[i];
    for (int j = 0; j < 16; ++j)        
        GsConstDataTri.triTable[i][j] = triTable[i][j];     
}

//EDGE
// Fill in a buffer description.
D3D11_BUFFER_DESC cbDesc1;
cbDesc1.ByteWidth = sizeof(GsConstDataEdge);
cbDesc1.Usage = D3D11_USAGE_DYNAMIC;
cbDesc1.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
cbDesc1.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
cbDesc1.MiscFlags = 0;
cbDesc1.StructureByteStride = 0;

// Fill in the subresource data.
D3D11_SUBRESOURCE_DATA InitData1;
InitData1.pSysMem = &GsConstDataEdge;
InitData1.SysMemPitch = 0;
InitData1.SysMemSlicePitch = 0;

// Create the buffer. 
auto hr = gameContext.pDevice->CreateBuffer(&cbDesc1, &InitData1, &g_pConstantBuffer1);

if (FAILED(hr)) 
    std::cout << "Error buffer creation1" << endl;  

// Set the buffer.
gameContext.pDeviceContext->GSSetConstantBuffers(0, 1, &g_pConstantBuffer1);
//

// TRI
// Fill in a buffer description.
D3D11_BUFFER_DESC cbDesc2;
cbDesc2.ByteWidth = sizeof(GsConstDataTri);
cbDesc2.Usage = D3D11_USAGE_DYNAMIC;
cbDesc2.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
cbDesc2.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
cbDesc2.MiscFlags = 0;
cbDesc2.StructureByteStride = 0;

// Fill in the subresource data.
D3D11_SUBRESOURCE_DATA InitData2;
InitData2.pSysMem = &GsConstDataTri;
InitData2.SysMemPitch = 0;
InitData2.SysMemSlicePitch = 0;

// Create the buffer. 
hr = gameContext.pDevice->CreateBuffer(&cbDesc2, &InitData2, &g_pConstantBuffer2);

if (FAILED(hr)) 
    std::cout << "Error buffer creation2" << endl;  

// Set the buffer.
gameContext.pDeviceContext->GSSetConstantBuffers(1, 1, &g_pConstantBuffer2);

这是我的HLSL着色器中的结构。

cbuffer GS_CONSTANT_BUFFER_EDGETABLE : register(b0)
{
    int edgeTable[256];
}

cbuffer GS_CONSTANT_BUFFER_TRITABLE : register(b1)
{
    int triTable[256][16];
}

编辑: http://imgur.com/Xv7B1SO 现在我确实拥有了我创建的2个缓冲区,但它们似乎没有被分配给HLSL代码中的cbuffers。

1 个答案:

答案 0 :(得分:0)

修正了它,我只是很快将它添加到管道中。 我必须在调用它之前分配它,但是在获取技术之后。