我目前正在尝试获得正确的模型视图端口转换。但是当我尝试使用视口矩阵多重播放我的精灵矩阵时,它会失败,但两个矩阵看起来都很好。
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)
更新 如果我使用发布设置构建它正在工作。但在调试中它不是。我确定设置中没有任何不同。 这似乎是一个故事。我刚刚检查了构建设置,它确实有效。改回来它没有用。真奇怪的事。
答案 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。)