[英]Render to texture for mini map, dirextX
我正在尝试将3d环境的鸟瞰图渲染为纹理,并将该纹理绘制为HUD来表示迷你地图,就好像它是一台照相机从上面向下看游戏一样。 我是3D编程和DirextX API的新手,因此我需要帮助。 通过一些示例和教程,这是我所拥有的,但仍然没有成功。
几乎我不知道如何将纹理作为HUD正确地绘制到屏幕上。 发生的情况是,引擎先运行beginProjectScene()和endProjectScene()方法,然后运行beginSuperImpose()方法。
beginProjectScene()创建要绘制的纹理,创建适当的视图和投影矩阵以及后缓冲区以及一个新的视口,并在备份当前视口后进行设置。 它还设置适当的渲染目标。
endProjectScene()还原备份的矩阵,视口,后备缓冲区。
beginSuperImpose()应该在屏幕上绘制纹理(texH)。
通过显示设备(d3dd)调用D3D API方法还有一些其他方法可以实现此目的。 但这似乎不起作用,实际上没有任何可能发生,我不确定为什么。 以前,在将渲染目标还原到endProjectScene()中的备份后备缓冲区之前,屏幕只是变黑了(出于明显的原因)。 我相信我的大部分问题都在使用多个视口,而且很多概念相对较新,我仍在努力完全掌握。
同样,在还原后缓冲区后调用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));
}
}
绘制场景后应绘制HUD,否则场景将覆盖HUD。
尝试在Draw调用中将1更改为255。 D3DCOLOR_RGBA的取值范围为0到255。alpha的值1几乎是透明的。
更改
Vector topRight(width() * 0.01f, height() * 0.01f, 0);
至:
Vector topRight(0.5f, 0.5f, 0);
看看它是否渲染。 这应该显示精灵,其左上角从屏幕的ay的3/4处开始,一直到屏幕的1/4处。
我怀疑您的宽度计算正在将其显示在屏幕之外。 DirectX渲染空间的x和y从-1变为1。 因此,如果您的宽度为1024,则乘以0.01f将得到1.024的值,该值不在屏幕的右侧。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.