C++ C++;DirectX10网格在一帧后消失,为什么?

C++ C++;DirectX10网格在一帧后消失,为什么?,c++,directx,directx-10,C++,Directx,Directx 10,第一次在这个网站上张贴海报。但是我遇到了严重的障碍,我迷路了。如果这是太多的阅读,问题是在底部。但我认为背景会有所帮助 关于该项目的一点背景: 我目前使用DirectX10设置了一个渲染引擎。在组件管理器中实现组件(数据)指针的设计(保存指向世界内部实体组件的指针)并将该数据发送到接口管理器(用于加载、创建、更新、呈现等的所有方法)之后,似乎是这样的 下面是一个类图的图像,使其更易于可视化: 编辑:(没有足够的代表发表文章,因此这里有一个链接: 编辑: 我的渲染引擎有一个奇怪的问题:只在一帧内

第一次在这个网站上张贴海报。但是我遇到了严重的障碍,我迷路了。如果这是太多的阅读,问题是在底部。但我认为背景会有所帮助

关于该项目的一点背景: 我目前使用DirectX10设置了一个渲染引擎。在组件管理器中实现组件(数据)指针的设计(保存指向世界内部实体组件的指针)并将该数据发送到接口管理器(用于加载、创建、更新、呈现等的所有方法)之后,似乎是这样的

下面是一个类图的图像,使其更易于可视化: 编辑:(没有足够的代表发表文章,因此这里有一个链接: 编辑:

我的渲染引擎有一个奇怪的问题:只在一帧内渲染一个立方体(从Wavefront.obj文件解析并放入一个自定义顶点数组)。在初始呈现后缓冲区后,我的立方体消失了

为了解决这个问题,我进行了大量调试,但没有找到答案。我有位置、比例、旋转等矢量变化的转储文件以及世界矩阵。所有关于对象在世界空间中的位置和相机在世界空间中的位置的数据都保持了完整性。我还检查了d查看其他指针是否存在损坏、在不应该修改的地方被修改或意外删除的问题

通过几次更新和渲染,我在局部区域中没有发现运动组件的变化, 纹理组件没有更改,着色器变量和指针也没有更改

这是最初运行的代码,然后是循环

void GameWorld::Load()
{
//initialize all members here
mInterface = InterfaceManager(pDXManager);

//create entities here
mEHouse = CEntity(
    CT::MESH | CT::MOVEMENT | CT::SHADER | CT::TEXTURE,
    "House", &mCManager);

mECamera = CEntity(
    CT::CAMERA | CT::MOVEMENT | CT::LIGHT,
    "Camera", &mCManager);

//HACKS FOR TESTING ONLY
//Ideally create script to parse to create entities;
//GameWorld will have dynamic entity list;
//////////////////////////////////////////////////
tm = CMesh("../Models/Box.obj");
mCManager.mMesh[0] = &tm;

//hmmm.... how to make non-RDMS style entities...
tc = CCamera(
    XMFLOAT3(0.0f, 0.0f, 1.0f),
    XMFLOAT3(0.0f, 0.0f, 0.0f),
    XMFLOAT3(0.0f, 1.0f, 0.0f), 1);
mCManager.mCamera[0] = &tc;

tmc = CMovement(
    XMFLOAT3(0.0f, 0.0f, -10.0f),
    XMFLOAT3(0.0f, 0.0f, 0.0f),
    XMFLOAT3(0.0f, 0.0f, 0.0f));
mCManager.mMovement[1] = &tmc;
////////////////////////////////////////////////////
//only after all entities are created
mInterface.onLoad(&mCManager);
}

//core game logic goes here
void GameWorld::Update(float dt)
{
mInterface.Update(dt, &mCManager);
}

//core rendering logic goes here
void GameWorld::Render()
{
pDXManager->BeginScene();

//render calls go here
mInterface.Render(&mCManager);

//disappears after end scene
pDXManager->EndScene();
}
以下是界面渲染和更新方法:

void InterfaceManager::onLoad(CComponentManager* pCManager)
{
//create all
for(int i = 0; i < pCManager->mTexture.size(); ++i)
{
    mTexture2D.loadTextureFromFile(pDXManager->mD3DDevice, pCManager->mTexture[i]);
}

for(int i = 0; i < pCManager->mMesh.size(); ++i)
{
    mMesh.loadMeshFromOBJ(pCManager->mMesh[i]);
    mMesh.createMesh(pDXManager->mD3DDevice, pCManager->mMesh[i]);
}

for(int i = 0; i < pCManager->mShader.size(); ++i)
{
    mShader.Init(pDXManager->mD3DDevice, pDXManager->mhWnd, pCManager->mShader[i], pCManager->mTexture[i]);
}
//TODO: put this somewhere else to maintain structure
XMMATRIX pFOVLH = XMMatrixPerspectiveFovLH((float)D3DX_PI / 4.0f, (float)pDXManager->mWindowWidth/pDXManager->mWindowHeight, 0.1f, 1000.0f);
XMStoreFloat4x4(&pCManager->mCamera[0]->mProjectionMat, pFOVLH);

}

void InterfaceManager::Update(float dt, CComponentManager* pCManager)
{
//update input
//update ai
//update collision detection
//update physics
//update movement
for(int i = 0; i < pCManager->mMovement.size(); ++i)
{
    mMovement.transformToWorld(pCManager->mMovement[i]);
}
//update animations
//update camera
//There is only ever one active camera
//TODO: somehow set up for an activecamera variable
mCamera.Update(pCManager->mCamera[0], pCManager->mMovement[pCManager->mCamera[0]->mOwnerID]);
}

void InterfaceManager::Render(CComponentManager* pCManager)
{
for(int i = 0; i < pCManager->mMesh.size(); ++i)
{
    //render meshes
    mMesh.RenderMeshes(pDXManager->mD3DDevice, pCManager->mMesh[i]);
    //set shader variables
    mShader.setShaderMatrices(pCManager->mCamera[0], pCManager->mShader[i], pCManager->mMovement[i]);
    mShader.setShaderLight(pCManager->mLight[i], pCManager->mShader[i]);
    mShader.setShaderTexture(pCManager->mTexture[i]);
    //render shader
    mShader.RenderShader(pDXManager->mD3DDevice, pCManager->mShader[i], pCManager->mMesh[i]);
}
}

从相机更新代码来看,一个明显的问题是lookAt变量

通常lookAt变量是一个“点”而不是一个“向量”(方向),但从代码来看,似乎您将其保存为一个点,但将其用作一个向量。而且您的相机定义也不完整,标准相机至少应包含:位置、向上方向和视图方向(或lookAt点)。 我假设您希望在ICamera::Update函数中旋转和平移相机,因此您可以向上旋转并查看方向,然后平移位置

我猜你的C移动会给你一个新的相机位置,并对相机进行旋转。然后,你可以尝试如下修改,(mEye和mLookAt是位置,mUp是方向)


是否清除深度缓冲区?@NicoSchertler是的,我清除后缓冲区。我使用ClearRenderTarget视图(mD3DDevice->ClearRenderTargetView(mRenderTargetView,BackufferColor);然后使用mD3DDevice->ClearDepthStencilView(mDepthStencilView,D3D10\u clear\u depth,1.0f,0);在任何场景的开头。在第一帧之后,如何触发以下重画?是否检查了每个帧的上下文是否相同?例如,帧缓冲区设置(清除颜色/深度缓冲区),光栅化/深度/混合状态等。可能值得尝试调试每个DirectX绘制调用,这就是为什么没有渲染任何内容。@WayneWang我尝试使用PIX,但在尝试创建rendertarget视图和设备时,它总是崩溃。但是,当在调试模式下运行时,它在VS2010中运行良好,直到我为多维数据集获取一帧,然后它消失。好的,有一点需要注意的是,我对可移动相机的错误计算是正确的,就像我对静态相机的错误计算一样。但是,有一点需要注意的是,存储mEye、mLookAt和mUp是错误的,而我真正需要的是Viewmatrix。不管怎样,感谢您的帮助以及其他人的帮助。
void ICamera::Update(CCamera* pCamera, CMovement* pMovement)
{
XMMATRIX rotMat = XMMatrixRotationRollPitchYaw(pMovement->mRotation.x,
    pMovement->mRotation.y,
    pMovement->mRotation.z);

XMMATRIX view = XMLoadFloat4x4(&pCamera->mViewMat);
XMVECTOR up = XMLoadFloat3(&pCamera->mUp);
XMVECTOR lookAt = XMLoadFloat3(&pCamera->mEye);
XMVECTOR pos = XMLoadFloat3(&pMovement->mPosition);

lookAt = XMVector3TransformCoord(lookAt, rotMat);
up = XMVector3TransformCoord(up, rotMat);

lookAt = pos + lookAt;

view = XMMatrixLookAtLH(pos,
    lookAt,
    up);

XMStoreFloat3(&pCamera->mEye, lookAt);
XMStoreFloat3(&pCamera->mUp, up);
XMStoreFloat4x4(&pCamera->mViewMat, view);
}
XMVECTOR up = XMLoadFloat3(&pCamera->mUp);
XMVECTOR lookAt = XMLoadFloat3(&pCamera->mLookAt);
XMVECTOR oldPos = XMLoadFloat3(&pCamera->mEye);
XMVECTOR viewDir = lookAt - oldPos;
XMVECTOR pos = XMLoadFloat3(&pMovement->mPosition);

viewDir = XMVector3TransformCoord(viewDir, rotMat);
up = XMVector3TransformCoord(up, rotMat);

lookAt = pos + viewDir;

view = XMMatrixLookAtLH(pos,
    lookAt,
    up);

XMStoreFloat3(&pCamera->mEye, position);
XMStoreFloat3(&pCamera->mLookAt, lookAt);
XMStoreFloat3(&pCamera->mUp, up);