Два постоянных буфера с одинаковыми элементами

Предположим, у меня есть следующий фрагмент вершинного шейдера HLSL с постоянными буферами:

cbuffer matrixBuffer
{
matrix worldMatrix;
matrix viewMatrix;
matrix projectionMatrix;
};

cbuffer matrixBuffer2
{
matrix worldMatrix2;
matrix viewMatrix2;
matrix projectionMatrix2;
};

Переменные из константных буферов затем используются в acctual vs function, поэтому мне нужно их установить.

И в C ++ я объявил следующую структуру:

struct MatrixType
{
D3DMATRIX world;
D3DXMATRIX view;
D3DXMATRIX projection;
};

В моем приложении при инициализации я создаю постоянный указатель буфера ID3D11Buffer *.

Позже для каждого фреймового метода я обновляю постоянный буфер, то есть я отображаю буфер, обновляю подресурс, удаляемый буфер и устанавливаю буфер в вершинный шейдер.

Все хорошо, когда у меня есть только один постоянный буфер, но вот мой вопрос.

Как DirectX дифференцируется между буферами? Например, я хочу установить worldMatrix2, как этого добиться?

Я прочитал MSDN ссылку, но я не получил ответа.

Разрешено ли иметь два или более постоянных буфера с одинаковым размером и элементами? Они хранятся в непрерывном фрагменте памяти, поэтому, когда я устанавливаю буферы, они устанавливаются в порядке их объявления в HLSL?

3

Решение

Вы можете указать, с каким регистром констант связан каждый буфер констант в вашей шейдерной программе:

cbuffer matrixBuffer : register(b0)
{
matrix worldMatrix;
matrix viewMatrix;
matrix projectionMatrix;
};

cbuffer matrixBuffer2 : register(b1)
{
matrix worldMatrix2;
matrix viewMatrix2;
matrix projectionMatrix2;
};

Когда вы связываете свои постоянные буферы с вашим вершинным шейдером в своем коде на C ++, вы указываете, к какому слоту привязываться, следующим образом:

// Set the buffers.
g_pd3dContext->VSSetConstantBuffers( 0, 1, &g_pConstantBuffer1 ); // Bind to slot 0
g_pd3dContext->VSSetConstantBuffers( 1, 1, &g_pConstantBuffer2 ); // Bind to slot 1

От MSDN:

void VSSetConstantBuffers(
[in]  UINT StartSlot,   <-- this is the slot parameter
[in]  UINT NumBuffers,
[in]  ID3D11Buffer *const *ppConstantBuffers
);

В вашем примере у вас есть выбор (потому что оба буфера имеют одинаковую структуру). Вы можете поддерживать два отдельных постоянных буфера и обновлять каждый по отдельности, или вы можете просто повторно использовать один и тот же постоянный буфер и обновлять его данные более одного раза за кадр. В этом случае вы должны выполнить обновление с использованием подресурса карты и т. Д., Выполнить шейдер, затем снова обновить буфер, используя подресурс карты, а затем снова запустить шейдер.

10

Другие решения

Тот же принцип заключается в связывании Shader Resource View в Shaders, возможно, этот пост вам тоже поможет:
DirectX Shader Resource View в шейдерах

0

По вопросам рекламы [email protected]