DirectX9を用いて複数のシーンを作成する方法

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

DirectX9を用いて複数のシーンを作成する方法

#1

投稿記事 by Integral » 13年前

なんと表現するのか分からなかったのでタイトルが適切かは分かりません。
今、DirectX9を用いて以下のような処理をしたいと思っています。

ある空間Aにaという板ポリゴンを配置します。それをウィンドウ上に描画するというのであればできるのですが問題は以下です。
「さらに別の空間Bを用意し、そこにbという板ポリゴンを描画します。ウィンドウの左半分に空間Aを描画、右半分に空間Bを描画する。」

これは決して複数のポリゴンを表示するにはどうしたらよいか?といった質問ではありません。空間Aに板ポリゴンbを配置し、空間Aをウィンドウ上に描画するのであればそれはできます。

今持っている本の付録についていたサンプルプログラムではどの変数を増やせば空間を別に用意できるのか分かりません。
この類の操作をしたサンプルプログラムがあればそれを見せていただけると一番助かるのですが、自分で調べる指針だけでも教えていただければと思います。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: DirectX9を用いて複数のシーンを作成する方法

#2

投稿記事 by softya(ソフト屋) » 13年前

マルチビューとか呼ばれるものですね。
右と左でビューポートとレンダリングするモデルを切り替えてやればよいかと思いますが、日頃DirectXで作らない人なので申し訳ないですがサンプルが提示できません。

「ビューポートとクリッピング (Direct3D 9)」
http://msdn.microsoft.com/ja-jp/library ... s.85).aspx
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

Integral

Re: DirectX9を用いて複数のシーンを作成する方法

#3

投稿記事 by Integral » 13年前

いつもお世話になってます。

やはりビューポートですか。
マルチビューで検索して色々調べてみたのですが、あまりよいサンプルを見つけることができませんでした。
(ゲームを作るとしたら複数のビューを作ってレイヤーのように管理するという処理は一般的なことだとさえ思っていたのですが…。)

よってどのようにプログラムを改変していってよいかわかりません。
もし他に分かる人がおられましたらアドバイスいただけると助かります。

ISLe
記事: 2650
登録日時: 15年前
連絡を取る:

Re: DirectX9を用いて複数のシーンを作成する方法

#4

投稿記事 by ISLe » 13年前

そのものズバリとはいかないですが、『Direct3D バックミラー』でググると良さげなページがヒットしますけど。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: DirectX9を用いて複数のシーンを作成する方法

#5

投稿記事 by softya(ソフト屋) » 13年前

ヒント程度ですが、こんなのどうでしょうか。
「多人数ゲーム - ゲームプログラミングWiki」
http://www.c3.club.kyutech.ac.jp/gamewi ... 1%BC%A5%E0

とりあえずやってみて悩んでみたほうが速いと思いますが。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

conio

Re: DirectX9を用いて複数のシーンを作成する方法

#6

投稿記事 by conio » 13年前

4人対戦プレイみたいな、画面分割を行うプログラムは以前書いたことがあったので載せてみます。
以下の様な感じでどうでしょうか?

#include <tchar.h>
#include <windows.h>
#include <dxerr9.h>
#include <d3d9.h>
#include <d3dx9.h>
#pragma warning( disable : 4996 ) // 無駄な警告を出さなくする
#include <strsafe.h>
#pragma warning( default : 4996 )

//メモリリークを調べるために必要。
#if _DEBUG
#include <crtdbg.h>
#define new ::new( _NORMAL_BLOCK, __FILE__, __LINE__ )
#endif

#define WINDOW_WIDTH (640) // ウィンドウの幅
#define WINDOW_HEIGHT (480) // ウィンドウの高さ
#define WINDOW_X ((WINDOW_WIDTH + GetSystemMetrics( SM_CXSIZEFRAME )*2))
#define WINDOW_Y ((WINDOW_HEIGHT + GetSystemMetrics( SM_CYSIZEFRAME )*2 + GetSystemMetrics( SM_CYCAPTION )))
#define SAFE_RELEASE(p) { if(p) { (p)->Release(); (p)=NULL; } }


HINSTANCE g_hInstance = NULL; // インスタンス・ハンドル
HWND g_hWindow = NULL; // ウインドウ・ハンドル
LPDIRECT3D9 g_pD3D = NULL; // Direct3Dインタフェース
LPDIRECT3DDEVICE9 g_pD3DDevice = NULL; // Direct3DDeviceインタフェース


#define MY_VERTEX_FVF (D3DFVF_XYZ | D3DFVF_DIFFUSE)
struct MY_VERTEX{
float px, py, pz;
DWORD color;
};

MY_VERTEX v1[] = { {-2.0f, 2.0f, 0.0f, 0xffff0000},
{ 2.0f, 2.0f, 0.0f, 0xff00ff00},
{-2.0f,-2.0f, 0.0f, 0xff0000ff},
{ 2.0f,-2.0f, 0.0f, 0xffffffff},};

struct MY_COLOR{
int r,g,b;
};

MY_COLOR g_color[] = { {0,0,0},
{20,60,20},
{20,60,20},
{0,0,0}};

D3DVIEWPORT9 g_port[] = { { 0, 0, WINDOW_WIDTH/2, WINDOW_HEIGHT/2,0.0f,1.0f},
{ WINDOW_WIDTH/2, 0, WINDOW_WIDTH/2, WINDOW_HEIGHT/2,0.0f,1.0f},
{ 0, WINDOW_HEIGHT/2, WINDOW_WIDTH/2, WINDOW_HEIGHT/2,0.0f,1.0f},
{ WINDOW_WIDTH/2, WINDOW_HEIGHT/2, WINDOW_WIDTH/2, WINDOW_HEIGHT/2,0.0f,1.0f}};

struct MY_VIEW{
D3DXVECTOR3 vEyePt;
D3DXVECTOR3 vLookatPt;
D3DXVECTOR3 vUpVec;
D3DXMATRIXA16 matView;
};

MY_VIEW g_view[] = {{D3DXVECTOR3( 0.0f, 4.0f,-6.0f), D3DXVECTOR3(0.0f, 0.0f, 0.0f), D3DXVECTOR3( 0.0f, 1.0f, 0.0f)},
{D3DXVECTOR3(0.0f, 0.0f, -6.0f), D3DXVECTOR3(0.0f, 0.0f, 0.0f), D3DXVECTOR3( 0.0f, 1.0f, 0.0f)},
{D3DXVECTOR3(0.0f, 0.0f, -5.0f), D3DXVECTOR3(0.0f, 0.0f, 0.0f), D3DXVECTOR3( 0.0f, 1.0f, 0.0f)},
{D3DXVECTOR3(0.0f,-6.0f, -8.0f), D3DXVECTOR3(0.0f, 0.0f, 0.0f), D3DXVECTOR3( 0.0f, 1.0f, 0.0f)}
};

//-----------------------------------------------------------------------------
// Name: MsgProc()
// Desc: The window's message handler
//-----------------------------------------------------------------------------
LRESULT WINAPI MsgProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
switch( msg )
{
case WM_DESTROY:
PostQuitMessage( 0 );
return 0;
}
return DefWindowProc( hWnd, msg, wParam, lParam );
}

//-----------------------------------------------------------------------------
// Name: InitApp()
// Desc: Initialize Window
//-----------------------------------------------------------------------------
HRESULT InitApp(HINSTANCE hInstance)
{
g_hInstance = hInstance;
WNDCLASSEX wcex ={sizeof(WNDCLASSEX), CS_HREDRAW | CS_VREDRAW, MsgProc, 0, 0, g_hInstance, NULL, NULL,
(HBRUSH)(COLOR_WINDOW+1), NULL, L"D3D Tutorial", NULL};

if( !RegisterClassEx( &wcex )){
return DXTRACE_ERR(L"InitApp", GetLastError());
}

// Create the application's window
g_hWindow = CreateWindow( L"D3D Tutorial", L"ゲームプログラミング",
WS_OVERLAPPEDWINDOW ^ WS_MAXIMIZEBOX ^ WS_MINIMIZEBOX, 100, 100, WINDOW_X, WINDOW_Y,
NULL, NULL, wcex.hInstance, NULL );

if (g_hWindow == NULL)
return DXTRACE_ERR(L"InitApp", GetLastError());

return S_OK;
}

//-----------------------------------------------------------------------------
// Name: InitDirectX()
// Desc: Initialize DirectX
//-----------------------------------------------------------------------------
HRESULT InitDirectX(void){

g_pD3D = Direct3DCreate9(D3D_SDK_VERSION);
if(g_pD3D == NULL){
DXTRACE_MSG(L"DirectXDeviceの初期化に失敗しました");
return E_FAIL;
}

D3DDISPLAYMODE d3ddm;
if(FAILED(g_pD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &d3ddm)))
{
DXTRACE_MSG(L"DirectX3DDeviceの初期化に失敗しました");
return E_FAIL;
}

D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory(&d3dpp, sizeof(d3dpp));
d3dpp.Windowed = TRUE;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;
d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;
d3dpp.EnableAutoDepthStencil = TRUE;
d3dpp.AutoDepthStencilFormat = D3DFMT_D16;

HRESULT hr = g_pD3D->CreateDevice(
D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,g_hWindow,
D3DCREATE_SOFTWARE_VERTEXPROCESSING,
&d3dpp,&g_pD3DDevice);

if(FAILED(hr))
{
hr = g_pD3D->CreateDevice(
D3DADAPTER_DEFAULT,
D3DDEVTYPE_HAL,g_hWindow,
D3DCREATE_SOFTWARE_VERTEXPROCESSING,
&d3dpp,&g_pD3DDevice);
if(FAILED(hr))
{
hr = g_pD3D->CreateDevice(
D3DADAPTER_DEFAULT,
D3DDEVTYPE_REF,g_hWindow,
D3DCREATE_SOFTWARE_VERTEXPROCESSING,
&d3dpp,&g_pD3DDevice);
if(FAILED(hr)){
DXTRACE_MSG(L"DirectX3DDeviceの初期化に失敗しました");
return E_FAIL;
}
}
}
//セットアップ レンダーステート
g_pD3DDevice->SetRenderState( D3DRS_LIGHTING, FALSE );
g_pD3DDevice->SetRenderState( D3DRS_DITHERENABLE, TRUE );
g_pD3DDevice->SetRenderState( D3DRS_ZENABLE, TRUE );
g_pD3DDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE );
g_pD3DDevice->SetRenderState( D3DRS_AMBIENT, 0x33333333 );
g_pD3DDevice->SetRenderState( D3DRS_NORMALIZENORMALS, TRUE );
g_pD3DDevice->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA );
g_pD3DDevice->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA );
g_pD3DDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE );
g_pD3DDevice->SetSamplerState( 0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR );
g_pD3DDevice->SetSamplerState( 0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR );

//ビュー行列作成
for(int i = 0, count = sizeof(g_view)/sizeof(g_view[0]); i < count; i++)
{
D3DXMatrixLookAtLH( &g_view.matView, &g_view.vEyePt, &g_view.vLookatPt, &g_view.vUpVec );
}
g_pD3DDevice->SetTransform( D3DTS_VIEW, &g_view[0].matView );

//射影行列作成
D3DXMATRIXA16 matProj;
D3DXMatrixPerspectiveFovLH( &matProj, D3DXToRadian(45.0f), (float)640/480, 1.0f, 100.0f );
g_pD3DDevice->SetTransform( D3DTS_PROJECTION, &matProj );

return S_OK;
}

//-----------------------------------------------------------------------------
// Name: Uninitialize()
// Desc: UnInitialize DirectX
//-----------------------------------------------------------------------------
void Uninitialize(void)
{
SAFE_RELEASE(g_pD3DDevice);
SAFE_RELEASE(g_pD3D);
}

//-----------------------------------------------------------------------------
// Name: WinMain()
// Desc: The application's entry point
//-----------------------------------------------------------------------------
int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
{
#ifdef _DEBUG
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
#endif

HRESULT hr;
if(FAILED(hr = InitApp(hInstance)))
{
return(0);
}

// Initialize Direct3D
if( SUCCEEDED(hr = InitDirectX()) )
{
MSG msg;
ZeroMemory( &msg, sizeof(msg) );

ShowWindow(g_hWindow, SW_SHOWDEFAULT);
UpdateWindow(g_hWindow);

D3DXMATRIX mat;
D3DXMatrixIdentity(&mat);
g_pD3DDevice->SetTransform(D3DTS_WORLD, &mat);

// Enter the message loop
while( msg.message!=WM_QUIT )
{
if( PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE ) )
{
TranslateMessage( &msg );
DispatchMessage( &msg );
}else{
g_pD3DDevice->BeginScene();

static int n = 0;
static int degree = 0;

if((n = (n + 1)%5)==0){
degree = (degree + 1) % 360;
}
D3DXMatrixRotationY(&mat, D3DXToRadian(degree));
g_pD3DDevice->SetTransform(D3DTS_WORLD, &mat);

//今回は4人対戦画面なので、4回繰り返す
for(int i = 0, count = sizeof(g_port)/sizeof(g_port[0]); i < count; i++)
{
//描画領域を変更(ビューポート行列)
g_pD3DDevice->SetViewport(&g_port);
//カメラの座標を変更(ビュー行列)
g_pD3DDevice->SetTransform(D3DTS_VIEW, &g_view.matView);
//描画領域にした所を任意の色でクリア
g_pD3DDevice->Clear( 0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER,
D3DCOLOR_XRGB(g_color.r,g_color.b,g_color.g), 1.0f, 0 );
//何かを描画する(今回は四角ポリゴン)
g_pD3DDevice->SetFVF(MY_VERTEX_FVF);
g_pD3DDevice->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 2, v1, sizeof(MY_VERTEX));

}

g_pD3DDevice->EndScene();
g_pD3DDevice->Present( NULL, NULL, NULL, NULL );
Sleep(1);
}
}
}
Uninitialize();
UnregisterClass( L"D3D Tutorial", g_hInstance );
return 0;
}

conio
記事: 9
登録日時: 13年前
連絡を取る:

Re: DirectX9を用いて複数のシーンを作成する方法

#7

投稿記事 by conio » 13年前

コードタグ忘れてたので もう一度貼ります(´・ω・`)

コード:

#include <tchar.h>   
#include <windows.h>
#include <dxerr9.h>
#include <d3d9.h>
#include <d3dx9.h>
#pragma warning( disable : 4996 ) // 無駄な警告を出さなくする
#include <strsafe.h>
#pragma warning( default : 4996 ) 

//メモリリークを調べるために必要。
#if _DEBUG   
#include <crtdbg.h>   
#define new  ::new( _NORMAL_BLOCK, __FILE__, __LINE__ )   
#endif

#define WINDOW_WIDTH  (640)		// ウィンドウの幅
#define WINDOW_HEIGHT (480)		// ウィンドウの高さ
#define WINDOW_X ((WINDOW_WIDTH + GetSystemMetrics( SM_CXSIZEFRAME )*2))
#define WINDOW_Y ((WINDOW_HEIGHT + GetSystemMetrics( SM_CYSIZEFRAME )*2 + GetSystemMetrics( SM_CYCAPTION )))
#define SAFE_RELEASE(p)  { if(p) { (p)->Release(); (p)=NULL; } }


HINSTANCE	g_hInstance		= NULL;		// インスタンス・ハンドル
HWND		g_hWindow		= NULL;		// ウインドウ・ハンドル
LPDIRECT3D9				g_pD3D			= NULL;		// Direct3Dインタフェース
LPDIRECT3DDEVICE9		g_pD3DDevice	= NULL;		// Direct3DDeviceインタフェース


#define MY_VERTEX_FVF  (D3DFVF_XYZ | D3DFVF_DIFFUSE)
struct MY_VERTEX{
	float px, py, pz;
	DWORD color;
};

MY_VERTEX v1[] = {	{-2.0f, 2.0f, 0.0f, 0xffff0000},
					{ 2.0f, 2.0f, 0.0f, 0xff00ff00},
					{-2.0f,-2.0f, 0.0f, 0xff0000ff},
					{ 2.0f,-2.0f, 0.0f, 0xffffffff},};

struct MY_COLOR{
	int r,g,b;
};

MY_COLOR g_color[] = {	{0,0,0},
						{20,60,20},
						{20,60,20},
						{0,0,0}};

D3DVIEWPORT9 g_port[] = {	{ 0, 0, WINDOW_WIDTH/2, WINDOW_HEIGHT/2,0.0f,1.0f},
							{ WINDOW_WIDTH/2, 0, WINDOW_WIDTH/2, WINDOW_HEIGHT/2,0.0f,1.0f},
							{ 0, WINDOW_HEIGHT/2, WINDOW_WIDTH/2, WINDOW_HEIGHT/2,0.0f,1.0f},
							{ WINDOW_WIDTH/2, WINDOW_HEIGHT/2, WINDOW_WIDTH/2, WINDOW_HEIGHT/2,0.0f,1.0f}};

struct MY_VIEW{
    D3DXVECTOR3 vEyePt;
	D3DXVECTOR3 vLookatPt;
    D3DXVECTOR3 vUpVec;
    D3DXMATRIXA16 matView;
};

MY_VIEW g_view[] = {{D3DXVECTOR3( 0.0f, 4.0f,-6.0f), D3DXVECTOR3(0.0f, 0.0f, 0.0f), D3DXVECTOR3( 0.0f, 1.0f, 0.0f)},
					{D3DXVECTOR3(0.0f, 0.0f, -6.0f), D3DXVECTOR3(0.0f, 0.0f, 0.0f), D3DXVECTOR3( 0.0f, 1.0f, 0.0f)},
					{D3DXVECTOR3(0.0f, 0.0f, -5.0f), D3DXVECTOR3(0.0f, 0.0f, 0.0f), D3DXVECTOR3( 0.0f, 1.0f, 0.0f)},
					{D3DXVECTOR3(0.0f,-6.0f, -8.0f), D3DXVECTOR3(0.0f, 0.0f, 0.0f), D3DXVECTOR3( 0.0f, 1.0f, 0.0f)}
					};

//-----------------------------------------------------------------------------
// Name: MsgProc()
// Desc: The window's message handler
//-----------------------------------------------------------------------------
LRESULT WINAPI MsgProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
    switch( msg )
    {
        case WM_DESTROY:
            PostQuitMessage( 0 );
            return 0;
    }
    return DefWindowProc( hWnd, msg, wParam, lParam );
}

//-----------------------------------------------------------------------------
// Name: InitApp()
// Desc: Initialize Window 
//-----------------------------------------------------------------------------
HRESULT InitApp(HINSTANCE hInstance)
{
	g_hInstance = hInstance;
   WNDCLASSEX wcex ={sizeof(WNDCLASSEX), CS_HREDRAW | CS_VREDRAW, MsgProc, 0, 0, g_hInstance, NULL, NULL,
                                  (HBRUSH)(COLOR_WINDOW+1), NULL, L"D3D Tutorial", NULL};

	if( !RegisterClassEx( &wcex )){
		return DXTRACE_ERR(L"InitApp", GetLastError());
	}

    // Create the application's window
    g_hWindow = CreateWindow( L"D3D Tutorial", L"ゲームプログラミング", 
                              WS_OVERLAPPEDWINDOW ^ WS_MAXIMIZEBOX ^ WS_MINIMIZEBOX, 100, 100, WINDOW_X, WINDOW_Y,
                              NULL, NULL, wcex.hInstance, NULL );

	if (g_hWindow == NULL)
		return DXTRACE_ERR(L"InitApp", GetLastError());

	return S_OK;
}

//-----------------------------------------------------------------------------
// Name: InitDirectX()
// Desc: Initialize DirectX
//-----------------------------------------------------------------------------
HRESULT InitDirectX(void){

    g_pD3D = Direct3DCreate9(D3D_SDK_VERSION);
    if(g_pD3D == NULL){
        DXTRACE_MSG(L"DirectXDeviceの初期化に失敗しました");
        return E_FAIL;
    }

    D3DDISPLAYMODE d3ddm;
    if(FAILED(g_pD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &d3ddm)))
    {
        DXTRACE_MSG(L"DirectX3DDeviceの初期化に失敗しました");
        return E_FAIL;
    }

    D3DPRESENT_PARAMETERS d3dpp;
    ZeroMemory(&d3dpp, sizeof(d3dpp));
    d3dpp.Windowed = TRUE;
    d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
    d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;
    d3dpp.PresentationInterval  = D3DPRESENT_INTERVAL_IMMEDIATE;
    d3dpp.EnableAutoDepthStencil = TRUE;
    d3dpp.AutoDepthStencilFormat = D3DFMT_D16;

    HRESULT hr = g_pD3D->CreateDevice(
		D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,g_hWindow,
		D3DCREATE_SOFTWARE_VERTEXPROCESSING,
		&d3dpp,&g_pD3DDevice);

	if(FAILED(hr))
	{
		hr = g_pD3D->CreateDevice(
			D3DADAPTER_DEFAULT,
			D3DDEVTYPE_HAL,g_hWindow,
			D3DCREATE_SOFTWARE_VERTEXPROCESSING,
			&d3dpp,&g_pD3DDevice);
		if(FAILED(hr))
		{
			hr = g_pD3D->CreateDevice(
				D3DADAPTER_DEFAULT,
				D3DDEVTYPE_REF,g_hWindow,
				D3DCREATE_SOFTWARE_VERTEXPROCESSING,
				&d3dpp,&g_pD3DDevice);
			if(FAILED(hr)){
				DXTRACE_MSG(L"DirectX3DDeviceの初期化に失敗しました");
				return E_FAIL;
			}
		}
	}
    //セットアップ レンダーステート
    g_pD3DDevice->SetRenderState( D3DRS_LIGHTING,         FALSE );
    g_pD3DDevice->SetRenderState( D3DRS_DITHERENABLE,     TRUE );
    g_pD3DDevice->SetRenderState( D3DRS_ZENABLE,          TRUE );
    g_pD3DDevice->SetRenderState( D3DRS_CULLMODE,         D3DCULL_NONE );
    g_pD3DDevice->SetRenderState( D3DRS_AMBIENT,          0x33333333 );
    g_pD3DDevice->SetRenderState( D3DRS_NORMALIZENORMALS, TRUE );
    g_pD3DDevice->SetRenderState( D3DRS_SRCBLEND,  D3DBLEND_SRCALPHA );
    g_pD3DDevice->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA );
    g_pD3DDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE );
    g_pD3DDevice->SetSamplerState( 0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR );
    g_pD3DDevice->SetSamplerState( 0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR );

	//ビュー行列作成
	for(int i = 0, count = sizeof(g_view)/sizeof(g_view[0]); i < count; i++)
	{
		D3DXMatrixLookAtLH( &g_view[i].matView, &g_view[i].vEyePt, &g_view[i].vLookatPt, &g_view[i].vUpVec );
	}
    g_pD3DDevice->SetTransform( D3DTS_VIEW, &g_view[0].matView );
	
	//射影行列作成
    D3DXMATRIXA16 matProj;
    D3DXMatrixPerspectiveFovLH( &matProj, D3DXToRadian(45.0f), (float)640/480, 1.0f, 100.0f );
    g_pD3DDevice->SetTransform( D3DTS_PROJECTION, &matProj );

	return S_OK;
}

//-----------------------------------------------------------------------------
// Name: Uninitialize()
// Desc: UnInitialize DirectX
//-----------------------------------------------------------------------------
void Uninitialize(void)
{
    SAFE_RELEASE(g_pD3DDevice);
    SAFE_RELEASE(g_pD3D);
}

//-----------------------------------------------------------------------------
// Name: WinMain()
// Desc: The application's entry point
//-----------------------------------------------------------------------------
int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
{
	#ifdef _DEBUG   
		_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);   
	#endif 

	HRESULT hr;
	if(FAILED(hr = InitApp(hInstance)))
	{
		return(0);
	}

    // Initialize Direct3D
    if( SUCCEEDED(hr = InitDirectX()) )
    { 
		MSG msg;
		ZeroMemory( &msg, sizeof(msg) );

		ShowWindow(g_hWindow, SW_SHOWDEFAULT);
		UpdateWindow(g_hWindow);

		D3DXMATRIX mat;
		D3DXMatrixIdentity(&mat);
		g_pD3DDevice->SetTransform(D3DTS_WORLD, &mat);
		
       // Enter the message loop
		while( msg.message!=WM_QUIT )
		{
			if( PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE ) )
			{
				TranslateMessage( &msg );
				DispatchMessage( &msg );
			}else{
				g_pD3DDevice->BeginScene();

				static int n = 0;
				static int degree = 0;

				if((n = (n + 1)%5)==0){
					degree = (degree + 1) % 360;
				}
				D3DXMatrixRotationY(&mat, D3DXToRadian(degree));
				g_pD3DDevice->SetTransform(D3DTS_WORLD, &mat);

				//今回は4人対戦画面なので、4回繰り返す
				for(int i = 0, count = sizeof(g_port)/sizeof(g_port[0]); i < count; i++)
				{
					//描画領域を変更(ビューポート行列)
					g_pD3DDevice->SetViewport(&g_port[i]);
					//カメラの座標を変更(ビュー行列)
					g_pD3DDevice->SetTransform(D3DTS_VIEW, &g_view[i].matView);
					//描画領域にした所を任意の色でクリア
					g_pD3DDevice->Clear( 0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, 
									   D3DCOLOR_XRGB(g_color[i].r,g_color[i].b,g_color[i].g), 1.0f, 0 );
					//何かを描画する(今回は四角ポリゴン)
					g_pD3DDevice->SetFVF(MY_VERTEX_FVF);
					g_pD3DDevice->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 2, v1, sizeof(MY_VERTEX));

				}

				g_pD3DDevice->EndScene();
				g_pD3DDevice->Present( NULL, NULL, NULL, NULL );
				Sleep(1);
			}
		}
    }
	Uninitialize();
	UnregisterClass( L"D3D Tutorial", g_hInstance );
	return 0;
}

スパルタ

Re: DirectX9を用いて複数のシーンを作成する方法

#8

投稿記事 by スパルタ » 13年前

【管理人によるコメント】
# 通報がありましたので、記事を一部削除・修正しました。

返信は無いのでしょうか?
複数画面とか検索ワード等検索出来るキーワードはあります。

私は誰にも頼らずDirectXのライブラリを作っています。

閉鎖

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