Матрицы, вызывающие сбой

У меня странная проблема с приложением Direct3D11, которую я пытаюсь решить уже несколько часов. Проблема в том, что метод:

void CameraClass::Render()
{
XMFLOAT3 sUp, sLookAt, sRotationInRadians;

sUp.x = 0.0f;
sUp.y = 1.0f;
sUp.z = 0.0f;

sLookAt.x = 0.0f;
sLookAt.y = 0.0f;
sLookAt.z = 1.0f;

sRotationInRadians.x = m_Rotation.x * 0.0174532925f;
sRotationInRadians.y = m_Rotation.y * 0.0174532925f;
sRotationInRadians.z = m_Rotation.z * 0.0174532925f;

XMVECTOR vecLookAt = XMVectorSet( sLookAt.x, sLookAt.y, sLookAt.z, 0.0f );
XMVECTOR vecUp = XMVectorSet( sUp.x, sUp.y, sUp.z, 0.0f );
XMVECTOR vecPosition = XMVectorSet( m_Position.x , m_Position.y, m_Position.z, 0.0f );

XMMATRIX RotationMatrix( XMMatrixRotationRollPitchYaw( sRotationInRadians.x, sRotationInRadians.y, sRotationInRadians.z ));

vecLookAt = XMVector3TransformCoord( vecLookAt, RotationMatrix );
vecUp = XMVector3TransformCoord( vecUp, RotationMatrix );

vecLookAt += vecPosition;

m_ViewMatrix = XMMatrixLookAtLH( vecPosition, vecLookAt, vecUp );
}

Все хорошо, пока не достигнет этой черты:

m_ViewMatrix = XMMatrixLookAtLH( vecPosition, vecLookAt, vecUp );

Каким-то образом это вызывает сбой приложения (переключается на не отвечающий, чтобы быть правильным).

А вот как выглядят реальные звонки:

XMMATRIX ViewMatrix;
XMMATRIX ProjectionMatrix;
XMMATRIX WorldMatrix;

m_D3D->BeginScene( 0.0f, 0.0f, 0.0f, 1.0f );

m_Camera->Render();

m_D3D->GetWorldMatrix( WorldMatrix );
m_D3D->GetProjectionMatrix( ProjectionMatrix );

Заранее, вершинные и пиксельные шейдеры прекрасно компилируются, так что это не проблема.
Скорее всего, я делаю что-то не так с xnamath (я совершенно новичок в этом), но я понятия не имею, что на Земле это может быть. Заранее спасибо. Я предоставлю больше информации, если это необходимо.

редактировать@ 1: С десятками изменений мне удалось заставить работать матрицы Проекции и Мира. Хотя я все еще не могу установить матрицу просмотра. Я изменил код, чтобы он соответствовал реальному, и избавился от того, что не важно.

редактировать@ 2: Последние новости с последней минуты: нет проблем с функцией XMMatrixLookAtLH, потому что я решил сохранить результат в локальной переменной, и он работает, но если я хочу назначить матрицу результатов для члена класса, я получаю сбой. Это, безусловно, интересно.

8

Решение

После многих часов, потраченных на попытки решить эту проблему, я думаю, что наконец-то решил ее.

XMMATRIX представляет 16-байтовую выровненную матрицу, и невыровненное распределение XMMATRIX вызывает эту ошибку при попытке скопировать значение. Это объясняет, почему это не всегда происходит и почему оно работает в другом режиме.

Лучшее решение, которое я нашел для этой проблемы, это использовать XMFLOAT4X4 для хранения значения.

Вот простой пример:

#include <windows.h>
#include <xnamath.h>

class Camera
{
protected:
XMFLOAT4X4  view_;
public:
XMFLOAT4X4  const& Update()
{
XMStoreFloat4x4(&this->view_ , XMMatrixIdentity());
return this->view_;
}
};

int main()
{
Camera* cam = new Camera;
XMFLOAT4X4 const& mat = cam->Update();
XMMATRIX x = XMLoadFloat4x4(&mat);
}
5

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

Так как сбой происходит при назначении:
m_ViewMatrix = XMMatrixLookAtLH (…

и в x64 сборка проходит лучше, чем в x86. Я бы предположил, что m_ViewMatrix или даже его контейнер m_Camera отображается в пространстве памяти, которое используется совместно с чем-то другим. Свертывание памяти. Переход к 64-битной системе является еще одним индикатором этого, так как, возможно, переместил память, чтобы скрыть проблему

Как вы распределяете поле m_Camera? Что является основным контейнером для всего?

Разместите полный заголовок CameraClass и место его размещения. Кроме того, попробуйте посыпать некоторые массивы вокруг полей и посмотреть, поможет ли это. Это также указывало бы на засорение памяти.

3

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector