Постоянные члены буфера обращаются к одной и той же памяти

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

Когда я использую средства отладки Visual Studio 2012, создается впечатление, что данные в буфере устанавливаются более или менее правильно:

0   [0x00000000-0x00000003] |                 +0
1   [0x00000004-0x00000007] |                 +1
2   [0x00000008-0x0000000b] |                 +1
3   [0x0000000c-0x0000000f] |                 +1
4   [0x00000010-0x00000013] |        +0.78539819
5   [0x00000014-0x00000017] |         +1.1760513
6   [0x00000018-0x0000001b] |                 +0
7   [0x0000001c-0x0000001f] |                 +1

Проблема в том, что когда я отлаживаю шейдер, sunAngle и phaseFunction имеют одинаковое значение, особенно 0.78539819, которое должно быть только значением sunAngle. Это меняется на 1.1760513 если я поменяю порядок двух поплавков, но оба будут одинаковыми. Я думал, что правильно собрал все воедино, но мне не хватает, как точно определить, какие константы есть в каждой части буфера?

Вот структура C ++, которую я использую:

struct SunData {
DirectX::XMFLOAT4 sunPosition;
float sunAngle;
float phaseFunctionResult;
};

И буфер шейдера выглядит так:

// updated as the sun moves through the sky
cbuffer sunDependent : register( b1 )
{
float4 sunPosition;
float sunAngle;              // theta
float phaseFunctionResult;   // F( theta, g )
}

Вот код, который я использую для инициализации буфера:

XMVECTOR pos =  XMVectorSet( 0, 1, 1, 1 );
XMStoreFloat3( &_sunPosition, pos );

XMStoreFloat4( &_sun.sunPosition, pos );
_sun.sunAngle = XMVectorGetX(
XMVector3AngleBetweenVectors( pos, XMVectorSet( 0, 1, 0, 0 ) )
);

_sun.phaseFunctionResult = _planet.phaseFunction( _sun.sunAngle );

// Fill in a buffer description.
D3D11_BUFFER_DESC cbDesc;
cbDesc.ByteWidth = sizeof( SunData ) + 8;
cbDesc.Usage = D3D11_USAGE_DYNAMIC;
cbDesc.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
cbDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
cbDesc.MiscFlags = 0;
cbDesc.StructureByteStride = 0;

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

// Create the buffer.
ID3D11Buffer *constantBuffer = nullptr;
HRESULT hr = _d3dDevice->CreateBuffer(
&cbDesc,
&data,
&constantBuffer
);

assert( SUCCEEDED( hr ) );

// Set the buffer.
_d3dDeviceContext->VSSetConstantBuffers( 1, 1, &constantBuffer );
_d3dDeviceContext->PSSetConstantBuffers( 1, 1, &constantBuffer );
Release( constantBuffer );

А вот пиксельный шейдер, который использует значения:

float4 main( in ATMOS_PS_INPUT input ) : SV_TARGET
{
float R = sunAngle * sunPosition.x * sunIntensity.x
* attenuationCoefficient.x
* phaseFunctionResult;

return float4( R, 1, 1, 1 );
}

0

Решение

Это похоже на проблему заполнения, как в этом вопросе: Вопрос

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

0

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

Других решений пока нет …

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