トップページ > 記事閲覧
DXGI1.1について
名前:Kim 日時: 2016/03/11 17:43

管理人様へ DXライブラリを使用させていただいてる者です。 私は今、oculusをdxlibで動作させようと考えています。 dxlibが"CreateDXGIFactory"を使用して"DXGI1.0"を生成しているのに対し、oculusを動作させるには、"CreateDXGIFactory1"を使い"DXGI1.1"を生成しなければならないようです。 そこで、dxlibで"DXGI1.1"を使用できるようにしてほしいです。 御返事よろしくお願いします。
メンテ

Page: 1 |

Re: DXGI1.1について ( No.1 )
名前:管理人 日時:2016/03/13 04:07

> そこで、dxlibで"DXGI1.1"を使用できるようにしてほしいです。 DXライブラリが内部で DXGI1.0 ではなく DXGI1.1 を使用するようにすることは できますが、「"DXGI1,1"を使用できるようにする」とはどのような意味でしょうか? DXGI1.1 のポインタを返す関数などを追加すれば良いでしょうか?
メンテ
Re: DXGI1.1について ( No.2 )
名前:Kim 日時:2016/03/13 17:40

御返事ありがとうございます。 管理人さんが言っている通り、DXライブラリが内部で DXGI1.0 ではなく DXGI1.1 を使用するようにしてもらいたいと思っています。 その理由としては、現在書いているOculusのコードでovr_CreateSwapTextureSetD3D11という関数がエラーを出しています。 そのエラーコードを確認してみると、"DXGI 1.0 is not supported. Please use CreateDXGIFactory1 / IDXGIFactory1."と書かれていました。 そして、ovr_CreateSwapTextureSetD3D11関数にDirectX系で渡している引数はdeviceという変数だけです。 このdeviceはDxLibのGetUseDirect3D11Device関数を使って取得しています。 なので私は、deviceにDXGIに関する情報が入っているのではと思いました。 そこで、DXライブラリが内部で DXGI1.0 ではなく DXGI1.1 を使用するようにしてもらいたいと思います。 下にコードを記載しておきます。 #include "DxLib.h" #include "OVR_CAPI_D3D.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { ChangeWindowMode( TRUE ); if ( DxLib_Init( ) == -1 ) { return 0; } ovrResult result; result = ovr_Initialize(nullptr); if ( !OVR_SUCCESS( result ) ) { return -1; } ovrHmd _hmd; ovrGraphicsLuid _luid; result = ovr_Create( &_hmd, &_luid ); if ( !OVR_SUCCESS( result ) ) { return -1; } ovrHmdDesc _hmdDesc = ovr_GetHmdDesc( _hmd ); ovrSizei idealSize = ovr_GetFovTextureSize( _hmd, ( ovrEyeType )0, _hmdDesc.DefaultEyeFov[ 0 ], 1.0f ); ID3D11Device* device = ( ID3D11Device* )GetUseDirect3D11Device( ); D3D11_TEXTURE2D_DESC dsDesc; dsDesc.Width = 640; dsDesc.Height = 480; dsDesc.MipLevels = 1; dsDesc.ArraySize = 1; dsDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM_SRGB; dsDesc.SampleDesc.Count = 1; dsDesc.SampleDesc.Quality = 0; dsDesc.Usage = D3D11_USAGE_DEFAULT; dsDesc.CPUAccessFlags = 0; dsDesc.MiscFlags = 0; dsDesc.BindFlags = D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_RENDER_TARGET; ovrSwapTextureSet* _TextureSet; result = ovr_CreateSwapTextureSetD3D11( _hmd, device, &dsDesc, ovrSwapTextureSetD3D11_Typeless, &_TextureSet ); if ( !OVR_SUCCESS( result ) ) { ovrErrorInfo errorInfo; ovr_GetLastErrorInfo( &errorInfo ); DrawFormatString( 0, 0, 0xff00ff, errorInfo.ErrorString ); WaitKey( ); return false; } ovr_Shutdown( ); DxLib_End( ); return 0; }
メンテ
Re: DXGI1.1について ( No.3 )
名前:管理人 日時:2016/03/13 18:48

ご返答ありがとうございます DXライブラリが DXGI1.1 を使うようにするだけで良いのですね こちらの暫定最新バージョンでは既に DXGI1.1 が使用できる場合は DXGI1.1 を 使用するように処理を変更していますので、よろしければお試しください m(_ _)m https://dxlib.xsrv.jp/temp/DxLibVCTest.exe // VisualC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCCTest.exe // BorlandC++ 用 https://dxlib.xsrv.jp/temp/DxLibGCC_DevCppTest.exe // Dev-C++ 用 https://dxlib.xsrv.jp/temp/DxLibGCC_MinGWTest.exe // MinGW 用 https://dxlib.xsrv.jp/temp/DxLibDotNet.zip // .NET用 https://dxlib.xsrv.jp/temp/DxLibMakeTest.exe // ソース (中身を既存のライブラリのファイルに上書きして、BCCをお使いの 場合は『再構築』を、VCをお使いの場合は『リビルド』を、 Dev-C++をお使いの方は「Rebuild All(Ctrl+F11)」をして下さい)
メンテ
Re: DXGI1.1について ( No.4 )
名前:Kim 日時:2016/03/14 16:21

無事解決し、エラーもなくなりました。 対応ありがとうございました。
メンテ
SetDrawScreenについて ( No.5 )
名前:Kim 日時:2016/07/15 10:23

管理人様へ 以前DXGI1.1について質問した者です。 Oculusの動作を進めていたところ、モニターに描画するためのBackBufferとは別に、Oculusのスクリーンに描画するためのBackBuffer(RenderTargetView)が必要になることがわかりました。 dxlibでは、"SetDrawScreen( )"を使ってBackbufferにアクセスすることができますが、OculusのBackBuffer(RenderTargetView)にアクセスするためには、"DX_SCREEN_BACK"の代わりに"ID3D11RenderTargetView"のポインタ型にアクセス出来なければいけません。 そこで、"SetDrawScreen( )"の引数として、ID3D11RenderTargetView*を使うために、ハンドル化できる関数を作っていただきたいのです。 また、他にBackBufferを作る方法があるのであれば教えていただきたいです。 御返事よろしくお願いします。
メンテ
Re: DXGI1.1について ( No.6 )
名前:Kim 日時:2016/07/15 20:08

すみません。先の内容をまとめきれてない状態で書き込んでしまいました。あらためて、質問し直しますので、先の件は返答する必要ありません。お手数をおかけして申し訳ありません
メンテ
Re: DXGI1.1について ( No.7 )
名前:Kim 日時:2016/07/15 22:15

あらためて、要望を書かせてもらいます。 dxlibでoculusの描画を行う研究をしていまして、問題にぶつかりました。 oculusの描画は、描画先として、ID3D11RenderTargetViewのアドレスを取得でき、そのアドレスに対して描画処理を行うという仕様になっております。 このアドレス先をSetDrawScreenで変更できる描画関数の出力先として設定できれば実現できそうだと考えました。 上記のような実装が対応可能でしたら、御手数ですがお願いしたいです。 ご検討のほどよろしくお願いします。
メンテ
Re: DXGI1.1について ( No.8 )
名前:管理人 日時:2016/07/17 05:41

裏画面( DX_SCREEN_BACK ) の ID3D11RenderTargetView のアドレスを取得するための関数を 追加しましたので、よろしければダウンロードしてください https://dxlib.xsrv.jp/temp/DxLibVCTest.exe // VisualC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCCTest.exe // BorlandC++ 用 https://dxlib.xsrv.jp/temp/DxLibGCC_DevCppTest.exe // Dev-C++ 用 https://dxlib.xsrv.jp/temp/DxLibGCC_MinGWTest.exe // MinGW 用 https://dxlib.xsrv.jp/temp/DxLibDotNet.zip // .NET用 https://dxlib.xsrv.jp/temp/DxLibMakeTest.exe // ソース (中身を既存のライブラリのファイルに上書きして、BCCをお使いの 場合は『再構築』を、VCをお使いの場合は『リビルド』を、 Dev-C++をお使いの方は「Rebuild All(Ctrl+F11)」をして下さい) 追加した関数はこちらです // 使用中のバックバッファのID3D11RenderTargetViewオブジェクトを取得する // ( 戻り値を ID3D11RenderTargetView * にキャストしてください ) const void* GetUseDirect3D11BackBufferRenderTargetView( void ) ; よろしければお使いください m(_ _)m
メンテ
Re: DXGI1.1について ( No.9 )
名前:Kim 日時:2016/07/19 11:33

御返事ありがとうございます。 提示していただ内容なのですが、こちらの説明不足がありましたので、改めて説明させてください。 御手数をお掛けして申し訳ありません。 dxlibの描画先(DX_SCREEN_BACK)のアドレスに描画を行うのではなく、oculusの描画先のアドレスを使い、dxlibの描画関数の出力先をoculusの描画先に設定できれば実現できると考えました。 こちらで考えたのが、以下のような仕様になります。 御手数ですが、再度御検討のほどよろしくお願いします。 宣言 void SetUseDirect3D11BackBufferRenderTargetView( const void * ) ; 概略 描画先グラフィック領域の指定 引数 const void * :実体はID3D11RenderTargetView* 描画する対象となるグラフィック領域を指す。 戻り値 なし 解説 oculusから取得したID3D11RenderTargetView *の値を引数として渡し、DxLibの描画命令の描画先をそのアドレスにする。 サンプルコード //oculusから取得したRenderTargetViewを受け取る。 ID3D11RenderTargetView* rtv = O_GetRTV( ); //RenderTargetViewを渡すことによって、描画先をoculusのアドレスに設定する。 SetUseDirect3D11BackBufferRenderTargetView( rtv ) ; //Sphereがrtvに描画されている。 DrawSphere3D( VGet( 320.0f, 200.0f, 0.0f ), 80.0f, 32, GetColor( 255,0,0 ), GetColor( 255, 255, 255 ), TRUE ) ;
メンテ
Re: DXGI1.1について ( No.10 )
名前:管理人 日時:2016/07/20 02:36

すみません、文章を正しく理解できていませんでした orz 少し調べてみた限りでは Kimさんご提案の関数の実装はできそうです ただ、少し手を加えなければならない箇所が多いので実装は次の週末になってしまうかもしれません 申し訳ありません m(_ _;m
メンテ
Re: DXGI1.1について ( No.11 )
名前:Kim 日時:2016/07/20 15:48

早速の返答ありがとうございます。 御手数お掛けしますが、是非ともよろしくお願い致します。
メンテ
Re: DXGI1.1について ( No.12 )
名前:管理人 日時:2016/07/23 17:03

お待たせしました、件の機能を実装したバージョンをアップしましたので よろしければダウンロードしてください m(_ _)m https://dxlib.xsrv.jp/temp/DxLibVCTest.exe // VisualC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCCTest.exe // BorlandC++ 用 https://dxlib.xsrv.jp/temp/DxLibGCC_DevCppTest.exe // Dev-C++ 用 https://dxlib.xsrv.jp/temp/DxLibGCC_MinGWTest.exe // MinGW 用 https://dxlib.xsrv.jp/temp/DxLibDotNet.zip // .NET用 https://dxlib.xsrv.jp/temp/DxLibMakeTest.exe // ソース (中身を既存のライブラリのファイルに上書きして、BCCをお使いの 場合は『再構築』を、VCをお使いの場合は『リビルド』を、 Dev-C++をお使いの方は「Rebuild All(Ctrl+F11)」をして下さい) 以下の関数を追加しました // 指定の ID3D11RenderTargetView を描画対象にする int SetDrawScreen_ID3D11RenderTargetView( const void *pID3D11RenderTargetView ) ; ( 処理内容的にほぼ SetDrawScreen と同じことをするのでこのような関数名にしました ) 手元では以下のような MakeScreen で作成した「描画対象にできるグラフィックハンドル」の ID3D11RenderTargetView を取得して SetDrawScreen_ID3D11RenderTargetView を使用して 描画対象にするといった簡易的なテストしかしていませんが、恐らく正常に動作すると思います (・・; #include "DxLib.h" int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { int Screen ; int x, xadd ; SetGraphMode( 640, 480, 32 ) ; ChangeWindowMode( TRUE ); if( DxLib_Init() == -1 ) { return -1 ; } Screen = MakeScreen( 640, 480, TRUE ) ; x = 0 ; xadd = 8 ; while( ProcessMessage() == 0 ) { x += xadd ; if( x < 0 || x > 640 ) xadd = -xadd ; // GetGraphID3D11RenderTargetView で取得した ID3D11RenderTargetView を // SetDrawScreen_ID3D11RenderTargetView に渡す SetDrawScreen_ID3D11RenderTargetView( GetGraphID3D11RenderTargetView( Screen ) ) ; ClearDrawScreen() ; DrawBox( x, 32, x + 64, 32 + 64, GetColor( 255,255,0 ), TRUE ) ; SetDrawScreen( DX_SCREEN_BACK ) ; DrawGraph( 0, 0, Screen, FALSE ) ; ScreenFlip() ; } DxLib_End() ; return 0 ; }
メンテ
Re: DXGI1.1について ( No.13 )
名前:Kim 日時:2016/07/24 12:46

御返答ありがとうございます。 検証次第ご報告させていただきます。 対応ありがとうございました。
メンテ
SetDrawScreen_ID3D11RTV()について ( No.14 )
名前:Ymd 日時:2018/07/24 01:53

管理人様、 以前にOculusへ描画するために、SetDrawScreen_ID3D11RenderTargetView()を作成してもらった者です。 SetDrawScreen_ID3D11RenderTargetView()について検証を行ったところ、 最後にSetGraphMode()で指定したサイズと、MakeScreen()のサイズが異なる場合、描画先の変更が行われていませんでした。又、ID3D11RenderTargetViewを自作した場合も同様の結果でした。 SetGraphMode()で指定する値は、ID3D11RenderTargetViewのサイズと異なる値にしたいと考えているため、 SetGraphMode()とID3D11RenderTargetViewのサイズが違う場合でも、描画先の変更を行えるようにして頂けないでしょうか。 [検証内容] 検証1:SetGraphMode()とMakeScreen()のサイズを異なる値で指定する 検証2:SetGraphMode()とRenderTargetViewのサイズを同じ値で指定・作成。実行途中にSetGraphMode()のサイズを変える。RenderTargetViewはそのまま。 検証3:初期化時にSetGraphMode()とMakeScreen()のサイズを異なる値で指定し、 SetDrawScreen_ID3D11RenderTargetView()の直前で、SetDrawScreen()で別の場所を描画先にする 結果1:同じ値の場合正常に描画される。異なる値の場合描画されない 結果2:SetGraphMode()のサイズを変えた後に、RenderTargetViewとサイズが異なっていた場合描画されない 結果3:直前で指定した場所へ描画される 下記に検証コードを記載しておきます。 <検証1>---------------------------------------------------------------------- #include "DxLib.h" int WINAPI WinMain( HINSTANCE, HINSTANCE, LPTSTR, int ) { //SetGraphModeに用いるサイズ int window_screen_size_w = 640; int window_screen_size_h = 480; //MakeScreenに用いるサイズ #if 0//SetGraphModeと同じサイズにする( 正常に描画先の変更が出来る ) int make_screen_size_w = window_screen_size_w; int make_screen_size_h = window_screen_size_h; #else//SetGraphModeと違うサイズにする( 正常に描画先の変更が出来ない ) int make_screen_size_w = window_screen_size_w + 10; int make_screen_size_h = window_screen_size_h + 10; #endif ChangeWindowMode( TRUE ); SetGraphMode( window_screen_size_w, window_screen_size_h, 16 ); if ( DxLib_Init( ) == -1 ) return -1; int screen = MakeScreen( make_screen_size_w, make_screen_size_h ); while ( ProcessMessage( ) == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 ) { //MakeScreenで作成したスクリーンへ描画 SetDrawScreen_ID3D11RenderTargetView( GetGraphID3D11RenderTargetView( screen ) ); ClearDrawScreen( ); DrawBox( 10, 10, 100, 100, GetColor( 255, 255, 0 ), TRUE ); //裏画面へ描画 SetDrawScreen( DX_SCREEN_BACK ); ClearDrawScreen( ); DrawGraph( 0, 0, screen, TRUE ); //反映 ScreenFlip( ); } DxLib_End( ); return 0; } --------------------------------------------------------------------------------- <検証2>---------------------------------------------------------------------- #include "DxLib.h" #include <d3d11.h> //RenderTargetViewの作成 void createRTV( ID3D11RenderTargetView** rtv, int ScreenSizeW, int ScreenSizeH ) { D3D11_TEXTURE2D_DESC dsDesc = { }; dsDesc.Width = ScreenSizeW; dsDesc.Height = ScreenSizeH; dsDesc.MipLevels = 1; dsDesc.ArraySize = 1; dsDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; dsDesc.SampleDesc.Count = 1; dsDesc.SampleDesc.Quality = 0; dsDesc.Usage = D3D11_USAGE_DEFAULT; dsDesc.CPUAccessFlags = 0; dsDesc.MiscFlags = 0; dsDesc.BindFlags = D3D11_BIND_RENDER_TARGET; D3D11_RENDER_TARGET_VIEW_DESC rtvd = { }; rtvd.Format = DXGI_FORMAT_R8G8B8A8_UNORM; rtvd.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2D; ID3D11Device* device = ( ID3D11Device* )GetUseDirect3D11Device( ); ID3D11Texture2D* tex = nullptr; device->CreateTexture2D( &dsDesc, nullptr, &tex ); device->CreateRenderTargetView( tex, &rtvd, &*rtv ); tex->Release( ); } //メイン int WINAPI WinMain( HINSTANCE, HINSTANCE, LPTSTR, int ) { bool old_key = false; bool now_key = false; int screen_size_w = 640; int screen_size_h = 480; ChangeWindowMode( TRUE ); SetGraphMode( screen_size_w, screen_size_h, 16 ); if ( DxLib_Init( ) == -1 ) return -1; ID3D11RenderTargetView* rtv = nullptr; createRTV( &rtv, screen_size_w, screen_size_h ); while ( ProcessMessage( ) == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 ) { old_key = now_key; now_key = ( CheckHitKeyAll( ) != 0 ); bool push_key = ( !old_key && now_key ); //キー入力でSetGraphModeのサイズを変更する if ( push_key ) { screen_size_w += 10; screen_size_h += 10; SetGraphMode( screen_size_w, screen_size_h, 16 ); #if 0//SetGraphModeのサイズを戻す。これを行わない場合描画されない screen_size_w -= 10; screen_size_h -= 10; SetGraphMode( screen_size_w, screen_size_h, 16 ); #endif } //RenderTargetViewへの描画 SetDrawScreen_ID3D11RenderTargetView( rtv ); ClearDrawScreen( ); DrawBox( 10, 10, 100, 100, GetColor( 255, 255, 0 ), TRUE ); //裏画面への描画 SetDrawScreen( DX_SCREEN_BACK ); ClearDrawScreen( ); ID3D11DeviceContext* context = ( ID3D11DeviceContext* )GetUseDirect3D11DeviceContext( ); ID3D11Resource* tex = nullptr; rtv->GetResource( &tex ); context->CopyResource( ( ID3D11Resource* )GetUseDirect3D11BackBufferTexture2D( ), tex ); tex->Release( ); //反映 ScreenFlip( ); } rtv->Release( ); DxLib_End( ); return 0; } --------------------------------------------------------------------------------- <検証3>---------------------------------------------------------------------- #include "DxLib.h" int WINAPI WinMain( HINSTANCE, HINSTANCE, LPTSTR, int ) { //SetGraphModeに用いるサイズ int window_screen_size_w = 640; int window_screen_size_h = 480; //MakeScreenに用いるサイズ //SetGraphModeと違うサイズにする( 正常に描画先の変更が出来ない ) int make_screen_size_w = window_screen_size_w + 10; int make_screen_size_h = window_screen_size_h + 10; ChangeWindowMode( TRUE ); SetGraphMode( window_screen_size_w, window_screen_size_h, 16 ); if ( DxLib_Init( ) == -1 ) return -1; int screen = MakeScreen( make_screen_size_w, make_screen_size_h ); while ( ProcessMessage( ) == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 ) { SetDrawScreen( DX_SCREEN_FRONT );//ここへ描画されてしまう SetDrawScreen_ID3D11RenderTargetView( GetGraphID3D11RenderTargetView( screen ) );//ここへ描画したい DrawBox( 10, 10, 100, 100, GetColor( 255, 255, 0 ), TRUE ); } DxLib_End( ); return 0; } ---------------------------------------------------------------------------------
メンテ
Re: DXGI1.1について ( No.15 )
名前:管理人 日時:2018/07/29 01:23

> SetGraphMode()で指定する値は、ID3D11RenderTargetViewのサイズと異なる値にしたいと考えているため、 > SetGraphMode()とID3D11RenderTargetViewのサイズが違う場合でも、描画先の変更を行えるようにして頂けないでしょうか。 Direct3D 11 では RenderTarget と同じサイズの DepthStencilTarget を設定しなければならないのですが、 今までの機能では RenderTarget のみ独自のものを設定するようになっていて、DepthStencilTarget は DXライブラリ側が用意した SetGraphMode で指定したサイズのものを使用するようにしていたため SetGraphMode で指定したサイズではない RenderTarget を使用しようとすると描画が行われなくなっていました 今回 SetDrawScreen_ID3D11RenderTargetView の第二引数で ID3D11DepthStencilView を指定できるようにしましたので、 よろしければ SetGraphMode とはサイズの異なる RenderTarget を指定する場合は、そのサイズと同じ DepthStencilTarget も 渡すようにしてみてください m(_ _)m https://dxlib.xsrv.jp/temp/DxLibVCTest.zip // Windows版 VisualC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCCTest.zip // Windows版 BorlandC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCC2Test.zip // Windows版 C++ Builder 10.1 Berlin 用 https://dxlib.xsrv.jp/temp/DxLibGCC_MinGWTest.zip // Windows版 MinGW 用 https://dxlib.xsrv.jp/temp/DxLibDotNet.zip // Windows版 .NET用 https://dxlib.xsrv.jp/temp/DxLibMakeTest.zip // ソース (中身を既存のライブラリのファイルに上書きして、BCCをお使いの 場合は『再構築』を、VCをお使いの場合は『リビルド』を、 Dev-C++をお使いの方は「Rebuild All(Ctrl+F11)」をして下さい) こちら↓はYmdさんの『SetGraphMode で指定したサイズと異なるサイズで MakeScreen を使用して作成した グラフィックハンドルをSetDrawScreen_ID3D11RenderTargetView で使用すると描画されない』のプログラムを 上記のバージョンを使用して正常に描画されるように変更したものとなります ( 新たに追加した描画対象にできるグラフィックハンドルの ID3D11DepthStencilView を取得するための関数 GetGraphID3D11DepthStencilView も使用しています ) #include "DxLib.h" int WINAPI WinMain( HINSTANCE, HINSTANCE, LPTSTR, int ) { //SetGraphModeに用いるサイズ int window_screen_size_w = 640; int window_screen_size_h = 480; //MakeScreenに用いるサイズ #if 0//SetGraphModeと同じサイズにする( 正常に描画先の変更が出来る ) int make_screen_size_w = window_screen_size_w; int make_screen_size_h = window_screen_size_h; #else//SetGraphModeと違うサイズにする( 正常に描画先の変更が出来ない ) int make_screen_size_w = window_screen_size_w + 10; int make_screen_size_h = window_screen_size_h + 10; #endif ChangeWindowMode( TRUE ); SetGraphMode( window_screen_size_w, window_screen_size_h, 16 ); if ( DxLib_Init( ) == -1 ) return -1; int screen = MakeScreen( make_screen_size_w, make_screen_size_h ); while ( ProcessMessage( ) == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 ) { //MakeScreenで作成したスクリーンへ描画 SetDrawScreen_ID3D11RenderTargetView( GetGraphID3D11RenderTargetView( screen ), GetGraphID3D11DepthStencilView( screen ) ); ClearDrawScreen( ); DrawBox( 10, 10, 100, 100, GetColor( 255, 255, 0 ), TRUE ); //裏画面へ描画 SetDrawScreen( DX_SCREEN_BACK ); ClearDrawScreen( ); DrawGraph( 0, 0, screen, TRUE ); //反映 ScreenFlip( ); } DxLib_End( ); return 0; }
メンテ
Re: DXGI1.1について ( No.16 )
名前:Ymd 日時:2018/07/31 09:59

管理人様、 対応ありがとうございました。 検証をおこなったところ、SetGraphMode()のサイズとRenderTargetViewのサイズが違う場合でも描画されたのですが、SetGraphMode()で指定したサイズを、RenderTargetViewで指定したサイズに拡大縮小したサイズで描画されていました。 (SetGraphModeのサイズで作ったグラフィックを、DrawExtendGraph()でRenderTargetViewのサイズを指定して描画したような感じ) MakeScreen()で検証した場合も同様の結果でした。 下記にこの現象が分かるコードを載せておきます (四角形を10*10の数で描画しようとしているが20*20で描画されている ) #include "DxLib.h" int WINAPI WinMain( HINSTANCE, HINSTANCE, LPTSTR, int ) { //SetGraphMode()のサイズ int window_screen_size_w = 640; int window_screen_size_h = 480; //MakeScreen()のサイズ //SetGraphMode()のサイズの半分にする。 int make_screen_size_w = window_screen_size_w / 2; int make_screen_size_h = window_screen_size_h / 2; ChangeWindowMode( TRUE ); SetGraphMode( window_screen_size_w, window_screen_size_h, 16 ); if ( DxLib_Init( ) == -1 ) return -1; int screen = MakeScreen( make_screen_size_w, make_screen_size_h ); unsigned int colors[ 2 ] = { 0xffffff, 0x555555 }; while ( ProcessMessage( ) == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 ) { //描画先をscreenにする SetDrawScreen_ID3D11RenderTargetView( GetGraphID3D11RenderTargetView( screen ), GetGraphID3D11DepthStencilView( screen ) ); ClearDrawScreen( ); //市松模様の描画( 四角形の数を10*10で表示しようとしているが、20*20で表示される ) int box_size_w = make_screen_size_w / 10; //四角形の横幅 int box_size_h = make_screen_size_h / 10; //四角形の高さ int box_num_x = 100; //四角形を描画する数( X方向に画面いっぱいに描画する ) int box_num_y = 100; //四角形を描画する数( Y方向に画面いっぱいに描画する ) for ( int i = 0; i < box_num_x; i++ ) { for ( int j = 0; j < box_num_y; j++ ) { int x = i * box_size_w; int y = j * box_size_h; unsigned int color = colors[ ( i + j ) % 2 ]; DrawBox( x, y, x + box_size_w, y + box_size_h, color, TRUE ); } } //裏画面へscreenを描画 SetDrawScreen( DX_SCREEN_BACK ); ClearDrawScreen( ); DrawGraph( 0, 0, screen, FALSE ); ScreenFlip( ); } DxLib_End( ); return 0; }
メンテ
Re: DXGI1.1について ( No.17 )
名前:管理人 日時:2018/08/01 01:47

すみません、ご指摘の通り SetGraphMode の解像度のままの描画を行ってしまっていました 修正版をアップしましたので、よろしければお試しください m(_ _;m https://dxlib.xsrv.jp/temp/DxLibVCTest.zip // Windows版 VisualC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCCTest.zip // Windows版 BorlandC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCC2Test.zip // Windows版 C++ Builder 10.1 Berlin 用 https://dxlib.xsrv.jp/temp/DxLibGCC_MinGWTest.zip // Windows版 MinGW 用 https://dxlib.xsrv.jp/temp/DxLibDotNet.zip // Windows版 .NET用 https://dxlib.xsrv.jp/temp/DxLibMakeTest.zip // ソース (中身を既存のライブラリのファイルに上書きして、BCCをお使いの 場合は『再構築』を、VCをお使いの場合は『リビルド』を、 Dev-C++をお使いの方は「Rebuild All(Ctrl+F11)」をして下さい)
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存