创建模型视口转换时,矩阵乘法失败

时间:2014-04-21 12:15:40

标签: c++ model-view-controller matrix directx

我目前正在尝试获得正确的模型视图端口转换。但是当我尝试使用视口矩阵多重播放我的精灵矩阵时,它会失败,但两个矩阵看起来都很好。

Unhandled exception at 0x00B4A67B in Project.exe: 0xC0000005: Access violation reading location 0xFFFFFFFF.

xnamathmatrix.inl第239行失败

// Perform the opertion on the first row
vX = _mm_mul_ps(vX,M2.r[0]);

但是vX和MR.r看起来都很好。

看看它失败的渲染方法:

void FirstScreen::render()
{
    if (m_d3dContext == 0)
        return;
    float clearColor[4] = { 0.0f, 0.0f, 0.25f, 1.0f };

    m_d3dContext->ClearRenderTargetView(m_backBufferTarget, clearColor);

    unsigned int stride = sizeof(VertexPos);
    unsigned int offset = 0;

    //setup for sprite. Inputlayout stays how it is
    m_d3dContext->IASetInputLayout(m_inputLayout);
    //set vertexes
    m_d3dContext->IASetVertexBuffers(0, 1, &sprite.m_vertexBuffer, &stride, &offset);
    m_d3dContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
    //set shader
    m_d3dContext->VSSetShader(m_vertexShader, 0, 0);
    m_d3dContext->PSSetShader(m_pixelShader, 0, 0);
    //set shader resource
    m_d3dContext->PSSetShaderResources(0, 1, &sprite.m_texture);
    m_d3dContext->PSSetSamplers(0, 1, &sprite.m_sampler);

    //now before we draw add the right projection
    XMMATRIX world = sprite.getWorldMatrix();
    printMatrix(world); //print the matrix
    printMatrix(m_viewportMatrix); // print the matrix

    XMMATRIX modelViewPort = XMMatrixMultiply(world, m_viewportMatrix); // <---- fails
    modelViewPort = XMMatrixTranspose(modelViewPort);
    //update the resources
    m_d3dContext->UpdateSubresource(m_modelViewPortBuffer, 0, 0, &modelViewPort, 0, 0);
    m_d3dContext->VSSetConstantBuffers(0, 1, &m_modelViewPortBuffer);

    //draw the 6 vertexes of the sprite
    m_d3dContext->Draw(6, 0);

    m_swapChain->Present(0, 0);
}

以下是m_viewportMatrix

的创建
bool FirstScreen::createViewPortMatrix(){
    XMMATRIX view = XMMatrixIdentity();
    XMMATRIX projection = XMMatrixOrthographicOffCenterLH(0.0f, std::atof(m_config->getConfigValue("width")), 0.0f, std::atof(m_config->getConfigValue("height")), 0.1f, 100.0f);
    m_viewportMatrix = XMMatrixMultiply(view, projection);
    return true;
}

以下是从精灵中获取World Matrix的方法:

XMMATRIX CustomSprite::getWorldMatrix()
{
    XMMATRIX translation = XMMatrixTranslation(m_position.x, m_position.y, 0.0f);
    XMMATRIX rotation = XMMatrixRotationZ(m_rotation);
    XMMATRIX scale = XMMatrixScaling(m_scale.x, m_scale.y, 1.0f);
    return translation*rotation*scale;
}

如果我运行它,我会得到以下矩阵,它应该是乘法并且在渲染内线处失败:

1 0 0 0 
0 1 0 0
0 0 1 0
100 300 0 1

0.001042 0 0 0
0 0.001389 0 0
0 0 0.010010 0
-1 -1 -0.001001 1

所以这里出了什么问题?

如果需要,我可以在某处上传代码以查看错误。(约6cpp + h)


更新 如果我使用发布设置构建它正在工作。但在调试中它不是。我确定设置中没有任何不同。 这似乎是一个故事。我刚刚检查了构建设置,它确实有效。改回来它没有用。真奇怪的事。

3 个答案:

答案 0 :(得分:1)

我有一个非常类似的问题。也许如果你尝试这样的事情:

XMMATRIX modelViewPort = ((XMMATRIX) world) * ((XMMATRIX) m_viewportMatrix); 

它对我有用。

答案 1 :(得分:0)

XMMATRIX代表一个16字节的对齐矩阵,因此您不应该在函数中返回它,因为返回的值不能保证是16字节对齐的。这将解释您使用x64 build获得的不同结果,因为这会改变内存分配方式的对齐方式。

XNAMath库建议您返回XMFLOAT4X4。要将XMMATRIX转移到XMFLOAT4X4,请使用XMStoreFloat4x4功能并执行相反的使用XMLoadFloat4x4功能。

答案 2 :(得分:0)

三年后在这里登陆的其他人。如果你有/ ZI&#34;编辑并继续&#34;那么会出现一个新的VC ++编译器错误。启用,尽管使用XMLoadFloat4x4。 (在15.5中影响VS 15.3和15.4,reportedly being fixed。)