gpt4 book ai didi

c++ - 创建模型视口(viewport)转换时 Matrix multiply 失败

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:23:00 25 4
gpt4 key购买 nike

我目前正在尝试进行正确的模型视口(viewport)转换。但是,当我尝试将我的 Sprite 矩阵与视口(viewport)矩阵进行多重播放时,它失败了,但两个矩阵看起来都很好。

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;
}

下面是从 Sprite 获取世界矩阵的方法:

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)


更新:如果我使用发布设置构建它正在工作。但在调试中它不是。我确信设置没有什么不同。这似乎是一个失败者。我刚刚检查了build设置并且它有效。改回来,还是不行。真是奇怪的事情。

最佳答案

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

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

它对我有用。

关于c++ - 创建模型视口(viewport)转换时 Matrix multiply 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23197257/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com