저는 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
사람이 내가 잘못 뭘하는지 말해 줄래?
당신의 논리는 정확이는 경우 'XMFLOAT4X4'대신 'XMFLOAT4X4A'를 사용하는 것이 더 쉽고 안전합니다. 패딩은 더 이상 필요하지 않습니다. – IInspectable
@IInspectable 사실, 일부 규칙은 더 세밀하고 C++ 언어로 재현 할 수 없습니다. OP 케이스의 경우에도 마찬가지입니다. 또 다른 해결책은'UpdateSubResource'에 코드 객체의 적절한 크기를 제공하는 것이지만, 디버그 레이어는 cbuffer 크기보다 작은 업로드 (우리의 경우에는 100 % 안전)라는 경고 메시지를 로그에 넘칩니다. – galop1n
고마워, 그래, 고쳐. 나는 그것이 그들이 msdn 페이지에서 말하는 것을 시도하고 있다는 것을 지금 깨닫는다. (그러나 나는 그들이 훨씬 더 분명했을 수 있다고 느낀다.) 예외가 유용한 정보를 포함하고 있다면 유용 할 것입니다. : | – Stef