通过 HLSL C++ 时常量缓冲区为空
Constant buffer is empty when passed HLSL C++
所以我从这个问题: 转移到了这个问题:)。
我在 C++ 中创建了 2 个常量缓冲区,并将其传递给我的 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。
修复了它,我很快就将它添加到管道中。
我不得不在调用它之前分配它,但在 get 技术之后。
所以我从这个问题:
我在 C++ 中创建了 2 个常量缓冲区,并将其传递给我的 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。
修复了它,我很快就将它添加到管道中。 我不得不在调用它之前分配它,但在 get 技术之后。