gpt4 book ai didi

c++ - 渲染到小 map 的纹理,directX

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:01:52 33 4
gpt4 key购买 nike

alt text

我正在尝试将 3d 环境的鸟瞰图渲染为纹理,并将该纹理绘制为 HUD 以表示迷你 map ,就好像它是从上方俯视游戏的相机。我在 3D 编程和 DirextX API 方面还很陌生,所以我需要这方面的帮助。通过使用一些示例和教程,这就是我所拥有的,但仍然没有成功。

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

beginProjectScene() 创建一个纹理来绘制,创建适当的 View 和投影矩阵和后台缓冲区以及一个新的视口(viewport),并在备份当前视口(viewport)后设置它们。它还设置适当的渲染目标。

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

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

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

此外,在恢复后备缓冲区后调用 SetTexture(0, texH) 时,我的白色球体会变成蓝色。

我稍微提到了这个:http://www.two-kings.de/tutorials/dxgraphics/dxgraphics16.html

主引擎循环:

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 几乎是透明的。

关于c++ - 渲染到小 map 的纹理,directX,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4392731/

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