2016-11-07 11 views
0

저는 Directx C++/Universal (CX) 프로젝트에서 작업하고 있습니다.정수 버퍼에 변수를 추가하는 방법

그런데 Directx11에 익숙하지 않습니다.

내 코드는 swapchainpanels를 사용하여 UWP에서 directx 렌더링과 관련된 MSDN의 샘플 프로젝트를 기반으로합니다.

이제 셰이더에 부동 변수를 추가하고 싶습니다. 나는 이것이 상수 버퍼를 사용하여 이루어져야한다고 생각한다. 현재 이것은 다음과 같습니다 (작동) :

//c++: 
struct ModelViewProjectionConstantBuffer 
{ 
    DirectX::XMFLOAT4X4 model; 
    DirectX::XMFLOAT4X4 view; 
    DirectX::XMFLOAT4X4 projection; 
    //float distance; 
}; 

//hlsl: 
cbuffer ModelViewProjectionConstantBuffer : register(b0) 
{ 
    matrix model; 
    matrix view; 
    matrix projection; 
    //float distance; 
}; 

이제 플로트를 추가하면 작동이 멈 춥니 다. 그것은 내가 (각 렌더링 프레임 전에 일어나는) 상수 버퍼를 업데이트 예외가 발생합니다 :

_d3dContext->UpdateSubresource(
    _constantBuffer.Get(), 
    0, 
    NULL, 
    &_constantBufferData, 
    0, 
    0 
); 

예외가 SEHException이다 (지금까지 내가 찾을 수 있습니다,이 나에게 아무 말도하지 않습니다).

나는 다음 페이지에서이 모든 것을 내놓고있어 : https://msdn.microsoft.com/en-us/library/ff476896(v=vs.85).aspx

사람이 내가 잘못 뭘하는지 말해 줄래?

답변

2

상수 버퍼의 크기는 16 바이트로 정렬되어 있습니다. 끝에 하나의 부동 소수점이있는 경우 실제로 상수 버퍼 크기는 16으로 증가하지만 코드 측에서는 구조체가 4만큼만 팽창됩니다. UpdateSubResource가이 12 개의 여분의 바이트를 읽고 메모리 액세스 위반을 시도합니다.

당신은 당신은 자세한 내용은 여기 패딩 규칙에 대해 읽을 수

struct ModelViewProjectionConstantBuffer 
{ 
    DirectX::XMFLOAT4X4 model; 
    DirectX::XMFLOAT4X4 view; 
    DirectX::XMFLOAT4X4 projection; 
    float distance; 
    float pad[3] 
}; 

같은 패딩을 추가하여 물건을 고정 할 수 있어야한다 : https://msdn.microsoft.com/en-us/library/windows/desktop/bb509632(v=vs.85).aspx

+0

당신의 논리는 정확이는 경우 'XMFLOAT4X4'대신 'XMFLOAT4X4A'를 사용하는 것이 더 쉽고 안전합니다. 패딩은 더 이상 필요하지 않습니다. – IInspectable

+0

@IInspectable 사실, 일부 규칙은 더 세밀하고 C++ 언어로 재현 할 수 없습니다. OP 케이스의 경우에도 마찬가지입니다. 또 다른 해결책은'UpdateSubResource'에 코드 객체의 적절한 크기를 제공하는 것이지만, 디버그 레이어는 cbuffer 크기보다 작은 업로드 (우리의 경우에는 100 % 안전)라는 경고 메시지를 로그에 넘칩니다. – galop1n

+0

고마워, 그래, 고쳐. 나는 그것이 그들이 msdn 페이지에서 말하는 것을 시도하고 있다는 것을 지금 깨닫는다. (그러나 나는 그들이 훨씬 더 분명했을 수 있다고 느낀다.) 예외가 유용한 정보를 포함하고 있다면 유용 할 것입니다. : | – Stef