window scaling hassle
i have this annoying problem i need help with.
if i make a window for direct x that is num x num in dimensions (width and height are the same) i can draw a 1.0f x 1.0f square and it will actually look like a square. if the window dimensions are different (if i initiate them differently or resize a 600x600 window), the polygon looks like a rectangle because it got streched in only one dimension. maybe i''m not using the aspect ratio corretly... but how do i make it so that when i resize a window, the contents inside are scaled properly in all 3 dimensions?
this is my matrix code... the program window size is 640 x 480
D3DXMATRIX matProj;
D3DXMatrixPerspectiveFovLH( &matProj, D3DX_PI/4, 1.0f, 1.0f, 100.0f );
g_pd3dDevice->SetTransform( D3DTS_PROJECTION, &matProj );
i believe the 3rd parameter is the aspect ratio correct? i tried changing it to (float)640/480 and (float)480/640 and any other weird numbers but nothing on the window changes.
The aspect ratio is the ratio between the width and height of the display. A 1:1 (the 1.0) means that the width and height are identical. If you are using a 640x480 resolution, then use a ratio of 1.333333 (which is 640/480). I use the following settings that always work for me:
D3DXMatrixPerspectiveFovLH(&matProj, D3DX_PI/4, 1.333333f, 1.0f, 10000.0f);
Jim Adams
D3DXMatrixPerspectiveFovLH(&matProj, D3DX_PI/4, 1.333333f, 1.0f, 10000.0f);
Jim Adams
For any window use this code:
RECT rc;
GetClientRect(hwndRender, &rc);
D3DXMatrixPerspectiveFovLH(..., float(rc.right)/rc.bottom, ...);
Note that you need float cast so that you don''t do integer division.
You might want to put this code also in your WM_SIZE handler. Since there is no way to change back-buffer size on the fly, when your window is resized you need to destroy d3d device and recreate it.
RECT rc;
GetClientRect(hwndRender, &rc);
D3DXMatrixPerspectiveFovLH(..., float(rc.right)/rc.bottom, ...);
Note that you need float cast so that you don''t do integer division.
You might want to put this code also in your WM_SIZE handler. Since there is no way to change back-buffer size on the fly, when your window is resized you need to destroy d3d device and recreate it.
This topic is closed to new replies.
Advertisement
Popular Topics
Advertisement