描画のサイズについて。

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
たろう

描画のサイズについて。

#1

投稿記事 by たろう » 15年前

DirectXで画像を出力しようとしたのですが、元のサイズではなく少し拡大された状態で出力されます。
元のサイズで出力したいのですが、どうすればよいでしょうか。
ソース載せます。
[/pre]#include<windows.h>
#include<stdio.h>
#include <d3dx9.h>
#pragma comment( lib, "d3dx9.lib")
#pragma comment( lib, "d3d9.lib" )
LPD3DXSPRITE g_pD3DXSprite = NULL;
LPDIRECT3DTEXTURE9 g_pD3DTexture = NULL;
char g_SpriteFileName[MAX_PATH] = "test.png";
WIN32_FIND_DATA FindFileData;
BYTE* data;
HRESULT hr;
LPDIRECT3D9 m_pD3D;
IDirect3DDevice9* g_pD3DDevice=NULL;
LPDIRECT3D9 g_pD3D = NULL; // Direct3Dインターフェイス
FILE *fp;
D3DDISPLAYMODE dmode;
D3DPRESENT_PARAMETERS g_D3DPP; // D3DDeviceの設定(現在)

LRESULT CALLBACK MainWndProc(HWND hWnd, UINT msg, UINT wParam, LONG lParam)
{
HRESULT hr = S_OK;

switch(msg)
{

case WM_DESTROY:
// ウインドウを閉じる
PostQuitMessage(0);
return 0;
}
// デフォルト処理
return DefWindowProc(hWnd, msg, wParam, lParam);
}
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hprevInst,LPSTR lpCmdLine,int nShowCmd)
{


WNDCLASSEX wc;
HWND hWnd;

wc.cbSize=sizeof(WNDCLASSEX);
wc.style =0;
wc.cbClsExtra=0;
wc.cbWndExtra=32;
wc.lpfnWndProc=MainWndProc;
wc.hInstance =hInstance;
wc.hIcon=LoadIcon(NULL,IDI_APPLICATION);
wc.hIconSm =LoadIcon(NULL,IDI_WINLOGO);
wc.hCursor=LoadCursor(NULL,IDC_ARROW);
wc.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
wc.lpszMenuName=NULL;
wc.lpszClassName="gamemain";


if (!RegisterClassEx(&wc))
return -1;
hWnd = CreateWindow("gamemain", "ant",
WS_OVERLAPPEDWINDOW,
0, 0, 640, 480,
NULL, NULL, hInstance, NULL);
if(hWnd==NULL)
{
return -1;
}
ShowWindow(hWnd,nShowCmd);
UpdateWindow(hWnd);

D3DCAPS9 Caps; // 能力を受け取るD3DCAPS9構造体
g_pD3D = Direct3DCreate9(D3D_SDK_VERSION);
if (g_pD3D == NULL)
return -1 ;

hr = g_pD3D->GetDeviceCaps(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, &Caps);
if (FAILED(hr))
{


hr = g_pD3D->GetDeviceCaps(D3DADAPTER_DEFAULT, D3DDEVTYPE_REF, &Caps);
if (FAILED(hr) )
return -1;
}

// 現在のディスプレイのフォーマットなどを取得しておく
hr = g_pD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &dmode);
if (FAILED(hr))
return -1;
ZeroMemory(&g_D3DPP, sizeof(g_D3DPP));
g_D3DPP.BackBufferCount = 1;
g_D3DPP.SwapEffect = D3DSWAPEFFECT_DISCARD;
g_D3DPP.hDeviceWindow = hWnd;
g_D3DPP.Windowed = TRUE;
g_D3DPP.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;

hr = g_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_REF, hWnd,
D3DCREATE_HARDWARE_VERTEXPROCESSING, &g_D3DPP, &g_pD3DDevice);
if (FAILED(hr))
{
hr = g_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_REF, hWnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING, &g_D3DPP, &g_pD3DDevice);
if (FAILED(hr))
return -1;
}


// その他のフォーマットを調べる(なし)




if((fp=fopen("test1.bmp","r+b"))==NULL)
{
return -1;
}
FindFirstFile("*.bmp",&FindFileData);
data=(BYTE*)malloc((size_t)(FindFileData.nFileSizeLow));
fread(data,FindFileData.nFileSizeLow,1,fp);

fclose(fp);
if( FAILED(D3DXCreateTextureFromFileInMemory(g_pD3DDevice,data,FindFileData.nFileSizeLow,&g_pD3DTexture)))
return -1;

// スプライト生成
if( FAILED(D3DXCreateSprite(g_pD3DDevice, &g_pD3DXSprite)))
{
return -1;
}

MSG msg;
do
{
if (PeekMessage(&msg, 0, 0, 0, PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
{
g_pD3DDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_ARGB( 255, 255, 255, 255 ), 0.5f, 0 );

if( SUCCEEDED( g_pD3DDevice->BeginScene() ) )
{
g_pD3DXSprite->Begin(D3DXSPRITE_ALPHABLEND | D3DXSPRITE_DONOTSAVESTATE);
g_pD3DXSprite->Draw(g_pD3DTexture,NULL,NULL,NULL,0xffffffff);
g_pD3DXSprite->End();

g_pD3DDevice->EndScene();
g_pD3DDevice->Present(NULL,NULL,NULL,NULL);
}
}

} while (msg.message != WM_QUIT);

return 0;
}[/pre]

シエル

Re:描画のサイズについて。

#2

投稿記事 by シエル » 15年前

D3DXCreateTextureFromFileInMemoryではサイズが2のべき乗に調整されるので、
下記のD3DXCreateTextureFromFileInMemoryExを使って、直接画像サイズを
指定してください。
その際、FilterとMipFilterにはD3DX_FILTER_NONEを設定して下さい。
http://msdn.microsoft.com/ja-jp/library/cc372744.aspx

たろう

Re:描画のサイズについて。

#3

投稿記事 by たろう » 15年前

おかげで表示できるようになりました。ありがとうございました!

閉鎖

“C言語何でも質問掲示板” へ戻る