C++ 小贴图的渲染到纹理,dirextX

C++ 小贴图的渲染到纹理,dirextX,c++,directx,direct3d,textures,C++,Directx,Direct3d,Textures,我正在尝试将3d环境的鸟瞰图渲染为纹理,并将该纹理绘制为HUD,以表示一张迷你地图,就像它是一个从上方俯视游戏的摄影机一样。我对3D编程和DirExtXAPI非常陌生,所以我需要这方面的帮助。通过使用一些示例和教程,我已经做到了这一点,但仍然没有成功 我几乎不知道如何正确地将纹理绘制到屏幕上作为HUD。引擎运行的是beginProjectScene()和endProjectScene()方法,然后是BeginPerImpose()方法 beginProjectScene()创建要绘制的纹理,创建

我正在尝试将3d环境的鸟瞰图渲染为纹理,并将该纹理绘制为HUD,以表示一张迷你地图,就像它是一个从上方俯视游戏的摄影机一样。我对3D编程和DirExtXAPI非常陌生,所以我需要这方面的帮助。通过使用一些示例和教程,我已经做到了这一点,但仍然没有成功

我几乎不知道如何正确地将纹理绘制到屏幕上作为HUD。引擎运行的是beginProjectScene()和endProjectScene()方法,然后是BeginPerImpose()方法

beginProjectScene()创建要绘制的纹理,创建适当的视图和投影矩阵、后缓冲区以及新视口,并在备份当前视口后对其进行设置。它还设置适当的渲染目标

endProjectScene()恢复备份的矩阵、视口和后台缓冲区

beginSuperImpose()应该将纹理(texH)绘制到屏幕上

有一些其他方法通过显示设备(d3dd)调用到D3DAPI方法来实现这一点。但这似乎不起作用,事实上什么都不可能发生,我也不知道为什么。之前,在将渲染目标恢复到endProjectScene()中的备份缓冲区之前,屏幕变黑(原因很明显)。我相信我的大部分问题都是使用多个视口,而且很多概念都相对较新,我仍在努力完全掌握

另外,在恢复后缓冲区后进行SetTexture(0,texH)调用时,我的白色球体变为蓝色

我有点提到这一点:

主机回路:

int Engine::run() { 

  ....

  // update the model components
  design->update(rightNow);
  Viewing->update(rightNow);
  audio->update(rightNow);
  lighting->update();
  hud->update(rightNow);

  //NEW CODE FOR HUD BEGIN
  // create the projection here - this part is new

  display->beginProjectScene();

  // draw the opaque scene objects
  scene->draw(true);
  // then the translucent/transparent objects
  display->alphaBlendOn();
  scene->draw(false);
  display->alphaBlendOff();
  display->endProjectScene();

  //NEW CODE FOR HUD END

  // draw the scene
  display->beginDraw();
  // draw the opaque scene objects
  scene->draw(true);
  // then the translucent/transparent objects
  display->alphaBlendOn();
  scene->draw(false);
  display->alphaBlendOff();

  // draw the HUD
  display->beginSuperimpose();
  hud->draw();
  display->endDraw();

  ....
}
显示:

void Display::beginProjectScene() {

    // create the texture COM object on which to draw
    // if the texture COM object does not yet exist
    //
    if (!texH && FAILED(D3DXCreateTexture(d3dd, TEXTURE_WIDTH,
     TEXTURE_HEIGHT, 0, D3DUSAGE_RENDERTARGET | D3DUSAGE_AUTOGENMIPMAP,
  D3DFMT_R5G6B5, D3DPOOL_DEFAULT, &texH)))
        error(L"Projection::11 Failed to create projection texture");

    // get the interface to the surface for the texture - GetSurfaceLevel
    // increases the reference count by 1 so we will have
    // to Release the interface when done
    //

    if (texH && SUCCEEDED(texH->GetSurfaceLevel(0, &textureSurface))) {

    // build the view matrix
    //
    // define position, heading, and up direction of camera and
    // create a view matrix and set the view transformationf
    //TEMPORTY VALUES
    Vector up(0,1,0);
    Vector heading(0,0,0); 
    Vector position(0.5,1,0.5);
    Vector view(1,0,0);

    // the look at point from the virtual camera
    Vector lookAt = position + heading;
    Matrix viewH = 
       ::view(view, position+heading, up);


   // build the projection matrix
   // ...TEST VALUES
   Matrix projectionProjection =
      ::projection(FIELD_OF_VIEW, aspect, NEAR_CLIPPING, 
         FAR_CLIPPING);


  // back up the projection matrix and the viewport, and back buffer
  d3dd->GetTransform(D3DTS_PROJECTION, &projBak);
  d3dd->GetViewport(&viewportBak);
  d3dd->GetRenderTarget(0, &pBackBuffer);

  // associate the backbuffer with the texture surface
  d3dd->SetRenderTarget(0, textureSurface);

  // project the scene onto the texture
  d3dd->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,
   D3DCOLOR_ARGB(100, 100, 100, alpha), 1.0f, 0);

  d3dd->BeginScene();

  //d3dd->SetTexture(0, texH);

  d3dd->SetTransform(D3DTS_VIEW, (D3DXMATRIX*)&viewH);
  d3dd->SetTransform(D3DTS_PROJECTION, (D3DMATRIX*)&projectionProjection);

  // define the viewport for the texture
  D3DVIEWPORT9 viewport;
  viewport.X = 0;
  viewport.Y = 0;
  viewport.Width  = TEXTURE_WIDTH;
  viewport.Height = TEXTURE_HEIGHT;
  viewport.MinZ = 0.0f;
  viewport.MaxZ = 1.0f;
  d3dd->SetViewport(&viewport);

  //d3dd->EndScene();

 }
}

void Display::endProjectScene() {

  d3dd->SetRenderTarget(0, pBackBuffer);
  d3dd->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,
   D3DCOLOR_ARGB(100, 100, 100, alpha), 1.0f, 0);


  //d3dd->BeginScene();

  //d3dd->SetTexture(0, texH);

  // restore the projection and viewport
  d3dd->SetTransform(D3DTS_PROJECTION, &projBak);
  d3dd->SetViewport(&viewportBak);

  d3dd->EndScene();


  // release the backbuffer associated with the texture
  textureSurface->Release();
  pBackBuffer->Release();
  //texH->Release();

} 

void Display::beginSuperimpose() {

   // prepare to draw the hud
   //
   if (spriteManager_){
     // start the sprite manager
     spriteManager_->Begin(D3DXSPRITE_ALPHABLEND);


     //NEW CODE FOR HUD
     Vector topRight(width() * 0.01f, height() * 0.01f, 0);

     spriteManager_->Draw(texH, NULL, NULL, (D3DXVECTOR3*)&topRight,
     D3DCOLOR_RGBA(SPRITEH_R, SPRITEH_G, SPRITEH_B,  1));
 }
}

尝试在调用Draw时将1更改为255。D3DCOLOR_RGBA采用0到255范围内的值。alpha的值为1是透明的,几乎是透明的。

在绘图调用中尝试将1更改为255。D3DCOLOR_RGBA采用0到255范围内的值。alpha的值为1是透明的,几乎是透明的。

Vector topRight(width() * 0.01f, height() * 0.01f, 0);
致:

然后看看它是否呈现。这应该显示精灵,左上角从屏幕上的3/4开始,向下的1/4开始

我怀疑你的宽度计算把它从屏幕上拖了下来。DirectX渲染空间在x和y中从-1变为1。因此,如果宽度为1024,则乘以0.01f将得到1.024的值,该值不在屏幕右侧。

更改

Vector topRight(width() * 0.01f, height() * 0.01f, 0);
致:

然后看看它是否呈现。这应该显示精灵,左上角从屏幕上的3/4开始,向下的1/4开始


我怀疑你的宽度计算把它从屏幕上拖了下来。DirectX渲染空间在x和y中从-1变为1。因此,如果宽度为1024,则乘以0.01f将得到1.024的值,该值位于屏幕右侧。

绘制场景后应绘制HUD,否则场景将覆盖HUD。

绘制场景后应绘制HUD,否则场景将覆盖HUD。

请更具体一点:您到底遇到了什么问题?地图一点也没有出现吗?它渲染不正确吗?如果是这样的话,它看起来像什么?它应该看起来像什么?我担心仅仅发布几十行代码并期望人们解决一个含糊不清的问题是不太合理的。谢谢。截图也总是很好的。。。它们通常有助于解决问题所在。在“超级”中关闭Z-Buffer也会有帮助吗?关闭Z-Buffer没有什么区别:(请说得更具体一点:你到底遇到了什么问题?地图根本没有显示出来吗?它渲染不正确吗?如果是的话,它看起来像什么?它应该看起来像什么?我担心仅仅发布几十行代码并期望人们解决一个含糊的问题是不太合理的。谢谢。截图是也总是很好…它们通常有助于解决问题所在。在“超级”中关闭Z-Buffer也会有帮助吗?关闭Z-Buffer没有什么区别:(