У меня странная проблема с приложением 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, потому что я решил сохранить результат в локальной переменной, и он работает, но если я хочу назначить матрицу результатов для члена класса, я получаю сбой. Это, безусловно, интересно.
После многих часов, потраченных на попытки решить эту проблему, я думаю, что наконец-то решил ее.
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);
}
Так как сбой происходит при назначении:
m_ViewMatrix = XMMatrixLookAtLH (…
и в x64 сборка проходит лучше, чем в x86. Я бы предположил, что m_ViewMatrix или даже его контейнер m_Camera отображается в пространстве памяти, которое используется совместно с чем-то другим. Свертывание памяти. Переход к 64-битной системе является еще одним индикатором этого, так как, возможно, переместил память, чтобы скрыть проблему
Как вы распределяете поле m_Camera? Что является основным контейнером для всего?
Разместите полный заголовок CameraClass и место его размещения. Кроме того, попробуйте посыпать некоторые массивы вокруг полей и посмотреть, поможет ли это. Это также указывало бы на засорение памяти.