• Advertisement
Sign in to follow this  

Changing resolution in Direct3D9 *solved*

This topic is 4725 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

I have created my back buffer at 1024x768. I have setup my 2d ortho matrix at 1024x768. Can I change the resolution by doing this to the vertex x and y coordinates:
vertex.x=(xPos/1024)*newResoultionX
vertex.y=(yPos/768)*newResoultionY



Basically the xPos and the yPos would be coordinates set in a 1024x768 resolution. So in order to convert them to a resolution different to the default of 1024x768, I divide them by the default resolution and then multiply by the new resoltion. Is this a good idea? Would I also have to resize the back buffer and the matrix? How would I do that? Can I just change the d3d9device presentation parameters for back buffer size and can I just create the matrix again at a new size? [Edited by - utilae on March 15, 2005 11:30:25 PM]

Share this post


Link to post
Share on other sites
Advertisement
Well, I would say if it works, it works! However, if you do change your resolution you will probably have to re-create your Direct3D Device (with a new backbuffer width and height, and the new resolution). Also, make sure your vertex.x and vertex.y are floating point numbers.

I'm not really quite sure how its done in professional games, but it might be worth giving it a try.

Share this post


Link to post
Share on other sites
Yes, you simply need to change your D3DPRESENT_PARAMETERS structure and then call IDirect3DDevice9::Reset(). This will reset the size of the entire swap chain automatically. I think this is *much* easier than how you are doing it now.

Note that if you have created any rendertargets, the size of them will be unaffected.

Share this post


Link to post
Share on other sites
Quote:
Original post by circlesoft
Yes, you simply need to change your D3DPRESENT_PARAMETERS structure and then call IDirect3DDevice9::Reset(). This will reset the size of the entire swap chain automatically.

Ok, sweet.

Quote:
Original post by circlesoft
I think this is *much* easier than how you are doing it now.

Are you refering to this:
vertex.x=(xPos/1024)*newResoultionX
vertex.y=(yPos/768)*newResoultionY

If I don't do it that way how would I specify where a vertex is in pixels? eg if I want a vertex at 100,100 and another at 200,200 I specify the coordinates on the 1024x768 scale. If the current resolution is different, then the forumla converts the coordinates of the vertices to the right resolution.

Is there a better way?

[Edited by - utilae on March 14, 2005 9:46:07 PM]

Share this post


Link to post
Share on other sites
How do I set the display mode?

I can use g_pD3DDevice9->GetAdapterDisplayMode to find out what display mode the user has, so I was wondering how you could set their display mode?

Share this post


Link to post
Share on other sites
Quote:
Original post by utilae
I can use g_pD3DDevice9->GetAdapterDisplayMode to find out what display mode the user has, so I was wondering how you could set their display mode?

All of the display mode stuff can be updated by changing the appropriate members of D3DPRESENT_PARAMETERS and calling IDirect3DDevice9::Reset().

Share this post


Link to post
Share on other sites
The problem is that when I change the display mode to 800x600 (using the reset device method), the screen appears as a yellow 800x600 area (my background is yellow) within a black 1024x768 area.

Share this post


Link to post
Share on other sites
If you're using a Ortho projection, you don't need to do that scaling yourself. You've set the projection to use 1024 virtual units along the X axis and they will be mapped to real units automatically.

Presumably you think you're seeing an 800x600 block in a 1024x768 screen, when you're actually seeing a scaled block in a 800x600 screen.

Share this post


Link to post
Share on other sites
Quote:
Original post by DrunkenHyena
If you're using a Ortho projection, you don't need to do that scaling yourself. You've set the projection to use 1024 virtual units along the X axis and they will be mapped to real units automatically.

Ok, that's cool. I'll get rid of the code that adjusts the vertices then.

Quote:
Original post by DrunkenHyena
Presumably you think you're seeing an 800x600 block in a 1024x768 screen, when you're actually seeing a scaled block in a 800x600 screen.

I'm still having problems with a 800x600 block (yellow) inside a 1024x768 screen (black). I can use my monitor controls to stretch the 800x600 block to fit to the screen, but I souldn't have to do that.

Here's my code:

//at the very start I set the presentation parameters
//g_nDefaultResoultionX=1024,g_nDefaultResoultionY=768
//set the presentation parameters
ZeroMemory(&g_d3dpp, sizeof(g_d3dpp));
g_d3dpp.BackBufferWidth=g_nDefaultResoultionX;
g_d3dpp.BackBufferHeight=g_nDefaultResoultionY;
g_d3dpp.BackBufferCount=1;
g_d3dpp.BackBufferFormat=D3DFMT_R5G6B5;
g_d3dpp.MultiSampleType=D3DMULTISAMPLE_NONE; //No multi-sampling
g_d3dpp.MultiSampleQuality=0;
g_d3dpp.SwapEffect=D3DSWAPEFFECT_DISCARD;
g_d3dpp.hDeviceWindow=hWndMain;
g_d3dpp.Windowed=false;
g_d3dpp.EnableAutoDepthStencil=true;//z buffer
g_d3dpp.AutoDepthStencilFormat=D3DFMT_D16;//z buffer
g_d3dpp.FullScreen_RefreshRateInHz=D3DPRESENT_RATE_DEFAULT;
g_d3dpp.PresentationInterval=D3DPRESENT_INTERVAL_IMMEDIATE;

//setup 2d ortho matrix
void SetupOrthoMatrix(void)
{
//setup matrix
D3DXMATRIX Ortho2D;
D3DXMATRIX Identity;

//1024x768 2d perspective (0 is near, 1 is far)
D3DXMatrixOrthoOffCenterLH(&Ortho2D,0,g_d3dpp.BackBufferWidth,g_d3dpp.BackBufferHeight,0,0.0,1.0);
D3DXMatrixIdentity(&Identity);

HRESULT hrProj=g_pD3DDevice9->SetTransform(D3DTS_PROJECTION,&Ortho2D);
HRESULT hrWorld=g_pD3DDevice9->SetTransform(D3DTS_WORLD,&Identity);
HRESULT hrView=g_pD3DDevice9->SetTransform(D3DTS_VIEW,&Identity);

//log errors
g_Log<<endl<<"SetupOrthoMatrix() Set Projection: "<<DXGetErrorString9(hrProj)<<endl;
g_Log<<"SetupOrthoMatrix() Set World: "<<DXGetErrorString9(hrWorld)<<endl;
g_Log<<"SetupOrthoMatrix() Set View: "<<DXGetErrorString9(hrView)<<endl<<endl;
}

void ChangeResolution(const int &newResoultionX,const int &newResoultionY,CTextureManager &TextureManager)
{
//set the size of the backbuffer to the new resolution
g_d3dpp.BackBufferWidth=newResoultionX;
g_d3dpp.BackBufferHeight=newResoultionY;

//FREE VOLATILE RESOURCES ( update as FreeVolatileResources() )
//free font resources
g_pFont->OnLostDevice();

//reset drd9 device
g_pD3DDevice9->Reset(&g_d3dpp);

HRESULT hr=g_pD3DDevice9->Reset(&g_d3dpp);
g_Log<<"Change resolution to "<<newResoultionX<<"x"<<newResoultionY<<": DeviceReset() "<<DXGetErrorString9(hr)<<endl;
if(SUCCEEDED(hr))
{
//INIT VOLATILE RESOURCES ( update as InitVolatileResources() )
//reset font resources
g_pFont->OnResetDevice();

//setup 2d ortho matrix
SetupOrthoMatrix();

//setup render states
SetupRenderStates();

//set last active texture or if the game is just starting set the default active texture
if(g_sLastActiveTexture=="")
TextureManager.SetTexture(g_sDefaultActiveTexture);
else
TextureManager.SetTexture(g_sLastActiveTexture);
}
}




Can someone help me? Thanks

Share this post


Link to post
Share on other sites
D3DXMatrixOrthoOffCenterLH(&Ortho2D,0,g_d3dpp.BackBufferWidth,g_d3dpp.BackBufferHeight,0,0.0,1.0);

If you want to use a 1024x768 virtual screen, then this won't do it. This will set the virtual coordinates to match your actual screen res, which isn't what you want (I think).

To be clear, what I think you want is to have all your objects laid out as if you have a 1024x768 display and if physically the display is actually 800x600, things should just be scaled accordingly. If that is the case, then rather than the backbuffer size, you should use 1024x768 in the line above.

If that's not what you wanted, then ignore everything I've said. :)

Share this post


Link to post
Share on other sites
Quote:
Original post by DrunkenHyena
To be clear, what I think you want is to have all your objects laid out as if you have a 1024x768 display and if physically the display is actually 800x600, things should just be scaled accordingly. If that is the case, then rather than the backbuffer size, you should use 1024x768 in the line above.

Yes, that is what I want. I changed the ortho projection to 1024x768 like you said, but I still have the problem of a 800x600 yellow area (my app) in a 1024x768 black area.

My windows screen resolution is 1152x864. My matrix is at 1024x768. My back buffer is at 800x600. So do I need to change my windows screen resolution some how and then change it back when the app exits (to fix my problem).

Share this post


Link to post
Share on other sites
Hi, I am still having the problem of a 800x600 yellow area (my app) in a 1024x768 black area.

Anyone got any ideas on this?

EDIT: Problem solved. It turns out that when the monitor is in a certain resolution for the first time, the screen needs to be adjusted.

[Edited by - utilae on March 15, 2005 11:44:36 PM]

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement