From: SFPGMR Date: Sun, 3 Jul 2011 00:40:20 +0000 (+0900) Subject: DirectX11 SDK のTutorial07をほとんど真似て立方体を回してみた。 X-Git-Url: http://git.osdn.net/view?p=shooting3%2Fdxgi_test.git;a=commitdiff_plain;h=32ae0d9fba7e63150b72bc2ee151369267267cdd DirectX11 SDK のTutorial07をほとんど真似て立方体を回してみた。 --- diff --git a/dxgi_test.sln b/dxgi_test.sln index 90311ea..6aff14d 100644 --- a/dxgi_test.sln +++ b/dxgi_test.sln @@ -11,8 +11,8 @@ Global Release|x64 = Release|x64 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {454B96E9-B255-4909-A167-7DFA3E4873A5}.Debug|Win32.ActiveCfg = Debug|x64 - {454B96E9-B255-4909-A167-7DFA3E4873A5}.Debug|Win32.Build.0 = Debug|x64 + {454B96E9-B255-4909-A167-7DFA3E4873A5}.Debug|Win32.ActiveCfg = Debug|Win32 + {454B96E9-B255-4909-A167-7DFA3E4873A5}.Debug|Win32.Build.0 = Debug|Win32 {454B96E9-B255-4909-A167-7DFA3E4873A5}.Debug|x64.ActiveCfg = Debug|x64 {454B96E9-B255-4909-A167-7DFA3E4873A5}.Debug|x64.Build.0 = Debug|x64 {454B96E9-B255-4909-A167-7DFA3E4873A5}.Release|Win32.ActiveCfg = Release|x64 diff --git a/dxgi_test/application.cpp b/dxgi_test/application.cpp index 19be347..faad57d 100644 --- a/dxgi_test/application.cpp +++ b/dxgi_test/application.cpp @@ -98,7 +98,8 @@ int application::execute(HINSTANCE hInstance, std::wstring(L"DXGIƒeƒXƒg"),std::wstring(L"DXGIƒeƒXƒg"))); // ƒƒbƒZ[ƒWƒ‹[ƒv‚ÌŽÀs - WPARAM ret = sf::run_message_loop()(); + //WPARAM ret = sf::run_message_loop()(); + WPARAM ret = sf::peek_message_loop(boost::bind(&toplevel_window::render,window.get()))(); return ret; } diff --git a/dxgi_test/dxgi_test.vcxproj b/dxgi_test/dxgi_test.vcxproj index 98a127f..cca3b9f 100644 --- a/dxgi_test/dxgi_test.vcxproj +++ b/dxgi_test/dxgi_test.vcxproj @@ -1,10 +1,18 @@  + + Debug + Win32 + Debug x64 + + Release + Win32 + Release x64 @@ -21,6 +29,12 @@ Unicode Windows7.1SDK + + Application + true + Unicode + Windows7.1SDK + Application false @@ -28,27 +42,65 @@ Unicode Windows7.1SDK + + Application + false + true + Unicode + Windows7.1SDK + + + + + + + C:\Program Files %28x86%29\Microsoft DirectX SDK %28June 2010%29\Include;$(IncludePath) + + C:\Program Files %28x86%29\Microsoft DirectX SDK %28June 2010%29\Include;$(IncludePath) + C:\Program Files %28x86%29\Microsoft DirectX SDK %28June 2010%29\Lib\x64;$(LibraryPath) + + C:\Program Files %28x86%29\Microsoft DirectX SDK %28June 2010%29\Lib\x64;$(LibraryPath) + Level3 Disabled MultiThreadedDebugDLL + Default + /Zm110 %(AdditionalOptions) + false + Fast + NotSet + + + true + MachineX64 + + + DeclareDPIAware.manifest %(AdditionalManifestFiles) + + + + + Level3 + Disabled + MultiThreadedDebugDLL 16Bytes /Zm110 %(AdditionalOptions) false @@ -74,6 +126,20 @@ true + + + Level3 + MaxSpeed + false + true + MultiThreadedDLL + + + true + true + true + + @@ -110,7 +176,9 @@ Create + Create Create + Create @@ -119,7 +187,7 @@ - + diff --git a/dxgi_test/dxgi_test.vcxproj.filters b/dxgi_test/dxgi_test.vcxproj.filters index b75e9c7..9afac51 100644 --- a/dxgi_test/dxgi_test.vcxproj.filters +++ b/dxgi_test/dxgi_test.vcxproj.filters @@ -77,11 +77,11 @@ - - - windows + + + \ No newline at end of file diff --git a/dxgi_test/minitimer.rc b/dxgi_test/minitimer.rc deleted file mode 100644 index 622e768..0000000 Binary files a/dxgi_test/minitimer.rc and /dev/null differ diff --git a/dxgi_test/sf_windows.h b/dxgi_test/sf_windows.h index 276d966..8fe16e9 100644 --- a/dxgi_test/sf_windows.h +++ b/dxgi_test/sf_windows.h @@ -70,12 +70,15 @@ _COM_SMARTPTR_TYPEDEF(IDXGIOutput,__uuidof(IDXGIOutput)); _COM_SMARTPTR_TYPEDEF(ID3D11Device,__uuidof(ID3D11Device)); _COM_SMARTPTR_TYPEDEF(ID3D11DeviceContext,__uuidof(ID3D11DeviceContext)); _COM_SMARTPTR_TYPEDEF(ID3D11RenderTargetView,__uuidof(ID3D11RenderTargetView)); +_COM_SMARTPTR_TYPEDEF(ID3D11DepthStencilView,__uuidof(ID3D11DepthStencilView)); _COM_SMARTPTR_TYPEDEF(ID3D11VertexShader,__uuidof(ID3D11VertexShader)); _COM_SMARTPTR_TYPEDEF(ID3D11PixelShader,__uuidof(ID3D11PixelShader)); _COM_SMARTPTR_TYPEDEF(ID3D11InputLayout,__uuidof(ID3D11InputLayout)); _COM_SMARTPTR_TYPEDEF(ID3D11Buffer,__uuidof(ID3D11Buffer)); _COM_SMARTPTR_TYPEDEF(ID3D11Texture2D,__uuidof(ID3D11Texture2D)); _COM_SMARTPTR_TYPEDEF(ID3DBlob,__uuidof(ID3DBlob)); +_COM_SMARTPTR_TYPEDEF(ID3D11ShaderResourceView,__uuidof(ID3D11ShaderResourceView)); +_COM_SMARTPTR_TYPEDEF(ID3D11SamplerState,__uuidof(ID3D11SamplerState)); template inline void safe_release(COM_SMART_PTR& ptr) { diff --git a/dxgi_test/toplevel_window.cpp b/dxgi_test/toplevel_window.cpp index 9b42497..a26051a 100644 --- a/dxgi_test/toplevel_window.cpp +++ b/dxgi_test/toplevel_window.cpp @@ -180,12 +180,35 @@ std::vector scanline_orders = (L"DXGI_MODE_SCALING_CENTERED",L"スケーリングなしを指定します。イメージはディスプレイの中央に配置されます。通常、このフラグは固定ドットピッチ ディスプレイ (LED ディスプレイなど) に使用します。") (L"DXGI_MODE_SCALING_STRETCHED",L"拡大スケーリングを指定します。"); +struct simple_vertex +{ + XMFLOAT3 pos; + XMFLOAT2 tex; +}; + +struct cb_never_changes +{ + XMMATRIX mView; +}; + +struct cb_change_on_resize +{ + XMMATRIX mProjection; +}; + +struct cb_changes_every_frame +{ + XMMATRIX mWorld; + XMFLOAT4 vMeshColor; +}; + struct toplevel_window::impl : public base_win32_window { impl(const std::wstring& menu_name,const std::wstring& name,bool fit_to_display,float width = 160,float height = 100) - : base_win32_window(menu_name,name,fit_to_display,width,height) , timer_(*this,1000)/*wm_task_bar_create_(0),result_time_(INTERVAL_SEC1),status_(active)*/ + : base_win32_window(menu_name,name,fit_to_display,width,height) , timer_(*this,1000),icon_(IDI_ICON1),mesh_color_(0.7f, 0.7f, 0.7f, 1.0f),init_(false)/*wm_task_bar_create_(0),result_time_(INTERVAL_SEC1),status_(active)*/ { + on_render.connect(boost::bind(&impl::render,this)); }; @@ -215,9 +238,12 @@ struct toplevel_window::impl : public base_win32_window { // バックバッファなどに関係するインターフェースを解放する // バックバッファを解放する - if(swap_chain_) + if(init_) { + calc_client_size(); + discard_swap_chain_dependent_resources(); swap_chain_->ResizeBuffers(0,0,0,DXGI_FORMAT_B8G8R8A8_UNORM,DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH); + create_swap_chain_dependent_resources(); } // バックバッファなどに関係するインターフェースを再作成する @@ -242,7 +268,7 @@ struct toplevel_window::impl : public base_win32_window paint_struct begin_paint(hwnd); //CloseHandle(cb); // 描画コードの呼び出し - render(); + //render(); } @@ -321,8 +347,8 @@ struct toplevel_window::impl : public base_win32_window virtual void create(){ create_device_independent_resources(); -// icon_ = create_icon(); - register_class(this->name_.c_str(),CS_HREDRAW | CS_VREDRAW ,0); +// icon_ = ::LoadIconW(HINST_THISCOMPONENT,MAKEINTRESOURCE(IDI_ICON1)); + register_class(this->name_.c_str(),CS_HREDRAW | CS_VREDRAW ,0,icon_.get()); create_window(); // 半透明ウィンドウを有効にする。 @@ -334,24 +360,38 @@ struct toplevel_window::impl : public base_win32_window virtual void discard_device() { - safe_release(view_); - safe_release(texture_); - safe_release(render_target_); + safe_release(sampler_state_); + safe_release(shader_res_view_); + safe_release(cb_changes_every_frame_); + safe_release(cb_change_on_resize_); + safe_release(cb_never_changes_); + safe_release(i_buffer_); + safe_release(v_buffer_); + safe_release(p_shader_); + safe_release(input_layout_); + safe_release(v_shader_); + discard_swap_chain_dependent_resources(); + //safe_release(render_target_); safe_release(swap_chain_); safe_release(d3d_context_); safe_release(d3d_device_); safe_release(adapter_); } + void calc_client_size() + { + //クライアント領域の現在の幅、高さを求める + RECT rc; + GetClientRect( hwnd_, &rc ); + client_width_ = rc.right - rc.left; + client_height_ = rc.bottom - rc.top; + } + virtual void create_device(){ + calc_client_size(); HRESULT hr = S_OK; - - //ウィンドウの現在の幅、高さを求める - //RECT rc; - //GetClientRect( hwnd_, &rc ); - //uint32_t width = rc.right - rc.left; - //uint32_t height = rc.bottom - rc.top; - + init_ = false; + // アダプタデバイス情報の取得 //LARGE_INTEGER version; THROW_IFERR(dxgi_factory_->EnumAdapters1(0,&adapter_)); @@ -371,7 +411,7 @@ struct toplevel_window::impl : public base_win32_window adapter_, D3D_DRIVER_TYPE_UNKNOWN , NULL, - D3D11_CREATE_DEVICE_BGRA_SUPPORT, + D3D11_CREATE_DEVICE_DEBUG, &feature_levels[0], feature_levels.size(), D3D11_SDK_VERSION, @@ -384,9 +424,9 @@ struct toplevel_window::impl : public base_win32_window // 表示モード DXGI_MODE_DESC desired_desc = {} , actual_desc = {}; // 各色8ビットで符号化なし正規化数 - desired_desc.Format = DXGI_FORMAT_B8G8R8A8_UNORM; - desired_desc.Height = 480;// 高さ - desired_desc.Width = 640;// 幅 + desired_desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; + desired_desc.Height = client_height_;// 高さ + desired_desc.Width = client_width_;// 幅 desired_desc.Scaling = DXGI_MODE_SCALING_CENTERED;// スケーリングなし // リフレッシュレートを60Hzを要求する desired_desc.RefreshRate.Numerator = 60000; @@ -403,7 +443,7 @@ struct toplevel_window::impl : public base_win32_window desc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; desc.BufferCount = 1; desc.OutputWindow = hwnd_; - desc.SwapEffect = DXGI_SWAP_EFFECT_DISCARD; + // desc.SwapEffect = DXGI_SWAP_EFFECT_; desc.Windowed = TRUE; desc.Flags = DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH; @@ -411,11 +451,288 @@ struct toplevel_window::impl : public base_win32_window } + // スワップチェーン依存リソースの作成 + create_swap_chain_dependent_resources(); + + { + // バーテックスシェーダのコンパイル + ID3DBlobPtr vsblob,vserrblob; + DWORD compile_flag = D3DCOMPILE_ENABLE_STRICTNESS; +#if defined( DEBUG ) || defined( _DEBUG ) + compile_flag |= D3DCOMPILE_DEBUG; +#endif + HRESULT hr = D3DX11CompileFromFile( L"Tutorial07.fx", NULL, NULL, "VS", "vs_4_0", + compile_flag, 0, NULL, &vsblob, &vserrblob, NULL ); + if( FAILED( hr ) ) + { + if( vserrblob != NULL ) + OutputDebugStringA( (char*)vserrblob->GetBufferPointer() ); + if( vserrblob ) vserrblob.Release(); + throw sf::win32_error_exception(hr); + } + + // バーテックスシェーダの生成 + THROW_IFERR(d3d_device_->CreateVertexShader( vsblob->GetBufferPointer(), vsblob->GetBufferSize(), NULL, &v_shader_ )); + + // 入力頂点レイアウトの定義 + D3D11_INPUT_ELEMENT_DESC + layout[] = { + { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 }, + { "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, 12, D3D11_INPUT_PER_VERTEX_DATA, 0 }}; + + // 入力頂点レイアウトの生成 + THROW_IFERR(d3d_device_->CreateInputLayout( layout, 2, vsblob->GetBufferPointer(), + vsblob->GetBufferSize(), &input_layout_ )); + vsblob.Release(); + } + + // 入力レイアウトの設定 + d3d_context_->IASetInputLayout( input_layout_ ); + + // ピクセル・シェーダーのコンパイル + { + ID3DBlobPtr psblob,pserror; + DWORD compile_flag = D3DCOMPILE_ENABLE_STRICTNESS; +#if defined( DEBUG ) || defined( _DEBUG ) + compile_flag |= D3DCOMPILE_DEBUG; +#endif + HRESULT hr = D3DX11CompileFromFile( L"Tutorial07.fx", NULL, NULL, "PS", "ps_4_0", + compile_flag, 0, NULL, &psblob, &pserror, NULL ); + if( FAILED( hr ) ) + { + if( pserror != NULL ) + OutputDebugStringA( (char*)pserror->GetBufferPointer() ); + safe_release(pserror); + throw sf::win32_error_exception(hr); + } + + // ピクセルシェーダの作成 + THROW_IFERR(d3d_device_->CreatePixelShader( psblob->GetBufferPointer(), psblob->GetBufferSize(), NULL, &p_shader_ )); + + psblob.Release(); + } + + // バーテックスバッファの作成 + // Create vertex buffer + simple_vertex vertices[] = + { + { XMFLOAT3( -1.0f, 1.0f, -1.0f ), XMFLOAT2( 0.0f, 0.0f ) }, + { XMFLOAT3( 1.0f, 1.0f, -1.0f ), XMFLOAT2( 1.0f, 0.0f ) }, + { XMFLOAT3( 1.0f, 1.0f, 1.0f ), XMFLOAT2( 1.0f, 1.0f ) }, + { XMFLOAT3( -1.0f, 1.0f, 1.0f ), XMFLOAT2( 0.0f, 1.0f ) }, + + { XMFLOAT3( -1.0f, -1.0f, -1.0f ), XMFLOAT2( 0.0f, 0.0f ) }, + { XMFLOAT3( 1.0f, -1.0f, -1.0f ), XMFLOAT2( 1.0f, 0.0f ) }, + { XMFLOAT3( 1.0f, -1.0f, 1.0f ), XMFLOAT2( 1.0f, 1.0f ) }, + { XMFLOAT3( -1.0f, -1.0f, 1.0f ), XMFLOAT2( 0.0f, 1.0f ) }, + + { XMFLOAT3( -1.0f, -1.0f, 1.0f ), XMFLOAT2( 0.0f, 0.0f ) }, + { XMFLOAT3( -1.0f, -1.0f, -1.0f ), XMFLOAT2( 1.0f, 0.0f ) }, + { XMFLOAT3( -1.0f, 1.0f, -1.0f ), XMFLOAT2( 1.0f, 1.0f ) }, + { XMFLOAT3( -1.0f, 1.0f, 1.0f ), XMFLOAT2( 0.0f, 1.0f ) }, + + { XMFLOAT3( 1.0f, -1.0f, 1.0f ), XMFLOAT2( 0.0f, 0.0f ) }, + { XMFLOAT3( 1.0f, -1.0f, -1.0f ), XMFLOAT2( 1.0f, 0.0f ) }, + { XMFLOAT3( 1.0f, 1.0f, -1.0f ), XMFLOAT2( 1.0f, 1.0f ) }, + { XMFLOAT3( 1.0f, 1.0f, 1.0f ), XMFLOAT2( 0.0f, 1.0f ) }, + + { XMFLOAT3( -1.0f, -1.0f, -1.0f ), XMFLOAT2( 0.0f, 0.0f ) }, + { XMFLOAT3( 1.0f, -1.0f, -1.0f ), XMFLOAT2( 1.0f, 0.0f ) }, + { XMFLOAT3( 1.0f, 1.0f, -1.0f ), XMFLOAT2( 1.0f, 1.0f ) }, + { XMFLOAT3( -1.0f, 1.0f, -1.0f ), XMFLOAT2( 0.0f, 1.0f ) }, + + { XMFLOAT3( -1.0f, -1.0f, 1.0f ), XMFLOAT2( 0.0f, 0.0f ) }, + { XMFLOAT3( 1.0f, -1.0f, 1.0f ), XMFLOAT2( 1.0f, 0.0f ) }, + { XMFLOAT3( 1.0f, 1.0f, 1.0f ), XMFLOAT2( 1.0f, 1.0f ) }, + { XMFLOAT3( -1.0f, 1.0f, 1.0f ), XMFLOAT2( 0.0f, 1.0f ) }, + }; + //std::vector vertices = boost::assign::list_of + // + // ( XMFLOAT3( -1.0f, 1.0f, -1.0f ), XMFLOAT2( 0.0f, 0.0f ) ) + // ( XMFLOAT3( 1.0f, 1.0f, -1.0f ), XMFLOAT2( 1.0f, 0.0f ) ) + // ( XMFLOAT3( 1.0f, 1.0f, 1.0f ), XMFLOAT2( 1.0f, 1.0f ) ) + // ( XMFLOAT3( -1.0f, 1.0f, 1.0f ), XMFLOAT2( 0.0f, 1.0f ) ) + + // ( XMFLOAT3( -1.0f, -1.0f, -1.0f ), XMFLOAT2( 0.0f, 0.0f ) ) + // ( XMFLOAT3( 1.0f, -1.0f, -1.0f ), XMFLOAT2( 1.0f, 0.0f ) ) + // ( XMFLOAT3( 1.0f, -1.0f, 1.0f ), XMFLOAT2( 1.0f, 1.0f ) ) + // ( XMFLOAT3( -1.0f, -1.0f, 1.0f ), XMFLOAT2( 0.0f, 1.0f ) ) + + // ( XMFLOAT3( -1.0f, -1.0f, 1.0f ), XMFLOAT2( 0.0f, 0.0f ) ) + // ( XMFLOAT3( -1.0f, -1.0f, -1.0f ), XMFLOAT2( 1.0f, 0.0f ) ) + // ( XMFLOAT3( -1.0f, 1.0f, -1.0f ), XMFLOAT2( 1.0f, 1.0f ) ) + // ( XMFLOAT3( -1.0f, 1.0f, 1.0f ), XMFLOAT2( 0.0f, 1.0f ) ) + + // ( XMFLOAT3( 1.0f, -1.0f, 1.0f ), XMFLOAT2( 0.0f, 0.0f ) ) + // ( XMFLOAT3( 1.0f, -1.0f, -1.0f ), XMFLOAT2( 1.0f, 0.0f ) ) + // ( XMFLOAT3( 1.0f, 1.0f, -1.0f ), XMFLOAT2( 1.0f, 1.0f ) ) + // ( XMFLOAT3( 1.0f, 1.0f, 1.0f ), XMFLOAT2( 0.0f, 1.0f ) ) + + // ( XMFLOAT3( -1.0f, -1.0f, -1.0f ), XMFLOAT2( 0.0f, 0.0f ) ) + // ( XMFLOAT3( 1.0f, -1.0f, -1.0f ), XMFLOAT2( 1.0f, 0.0f ) ) + // ( XMFLOAT3( 1.0f, 1.0f, -1.0f ), XMFLOAT2( 1.0f, 1.0f ) ) + // ( XMFLOAT3( -1.0f, 1.0f, -1.0f ), XMFLOAT2( 0.0f, 1.0f ) ) + + // ( XMFLOAT3( -1.0f, -1.0f, 1.0f ), XMFLOAT2( 0.0f, 0.0f ) ) + // ( XMFLOAT3( 1.0f, -1.0f, 1.0f ), XMFLOAT2( 1.0f, 0.0f ) ) + // ( XMFLOAT3( 1.0f, 1.0f, 1.0f ), XMFLOAT2( 1.0f, 1.0f ) ) + // ( XMFLOAT3( -1.0f, 1.0f, 1.0f ), XMFLOAT2( 0.0f, 1.0f ) ); + + D3D11_BUFFER_DESC bd = {}; + bd.Usage = D3D11_USAGE_DEFAULT; + bd.ByteWidth = sizeof( simple_vertex ) * 24; + bd.BindFlags = D3D11_BIND_VERTEX_BUFFER; + bd.CPUAccessFlags = 0; + + D3D11_SUBRESOURCE_DATA init_data = {}; + init_data.pSysMem = vertices; + THROW_IFERR(d3d_device_->CreateBuffer( &bd, &init_data, &v_buffer_ )); + + // 頂点バッファのセット + uint32_t stride = sizeof( simple_vertex ); + uint32_t offset = 0; + d3d_context_->IASetVertexBuffers( 0, 1, &v_buffer_.GetInterfacePtr(), &stride, &offset ); + + // インデックスバッファの生成 + WORD indices[] = + { + 3,1,0, + 2,1,3, + + 6,4,5, + 7,4,6, + + 11,9,8, + 10,9,11, + + 14,12,13, + 15,12,14, + + 19,17,16, + 18,17,19, + + 22,20,21, + 23,20,22 + }; + + bd.Usage = D3D11_USAGE_DEFAULT; + bd.ByteWidth = sizeof( WORD ) * 36; + bd.BindFlags = D3D11_BIND_INDEX_BUFFER; + bd.CPUAccessFlags = 0; + init_data.pSysMem = indices; + THROW_IFERR(d3d_device_->CreateBuffer( &bd, &init_data, &i_buffer_ )); + + // インデックスバッファのセット + d3d_context_->IASetIndexBuffer( i_buffer_.GetInterfacePtr(), DXGI_FORMAT_R16_UINT, 0 ); + + // プリミティブの形態を指定する + d3d_context_->IASetPrimitiveTopology( D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST ); + + // 定数バッファを生成する。 + bd.Usage = D3D11_USAGE_DEFAULT; + bd.ByteWidth = sizeof(cb_never_changes); + bd.BindFlags = D3D11_BIND_CONSTANT_BUFFER; + bd.CPUAccessFlags = 0; + THROW_IFERR(d3d_device_->CreateBuffer( &bd, NULL, &cb_never_changes_ )); + + bd.ByteWidth = sizeof(cb_change_on_resize); + THROW_IFERR(d3d_device_->CreateBuffer( &bd, NULL, &cb_change_on_resize_ )); + + bd.ByteWidth = sizeof(cb_changes_every_frame); + THROW_IFERR(d3d_device_->CreateBuffer( &bd, NULL, &cb_changes_every_frame_ )); + + // テクスチャのロード + THROW_IFERR(D3DX11CreateShaderResourceViewFromFile( d3d_device_, L"SF.dds", NULL, NULL, &shader_res_view_, NULL )); + + // サンプルステートの生成 + D3D11_SAMPLER_DESC sdesc = {}; + sdesc.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR; + sdesc.AddressU = D3D11_TEXTURE_ADDRESS_WRAP; + sdesc.AddressV = D3D11_TEXTURE_ADDRESS_WRAP; + sdesc.AddressW = D3D11_TEXTURE_ADDRESS_WRAP; + sdesc.ComparisonFunc = D3D11_COMPARISON_NEVER; + sdesc.MinLOD = 0; + sdesc.MaxLOD = D3D11_FLOAT32_MAX; + THROW_IFERR(d3d_device_->CreateSamplerState( &sdesc, &sampler_state_ )); + + // ワールド座標変換行列のセットアップ + mat_world_ = XMMatrixIdentity(); + + //g_vMeshColor( 0.7f, 0.7f, 0.7f, 1.0f ); + + + // ビュー行列のセットアップ + XMVECTOR eye = XMVectorSet( 0.0f, 3.0f, -6.0f, 0.0f ); + XMVECTOR at = XMVectorSet( 0.0f, 1.0f, 0.0f, 0.0f ); + XMVECTOR up = XMVectorSet( 0.0f, 1.0f, 0.0f, 0.0f ); + mat_view_ = XMMatrixLookAtLH( eye, at, up ); + cb_never_changes cnc; + cnc.mView = XMMatrixTranspose( mat_view_ ); + // 定数バッファに格納 + d3d_context_->UpdateSubresource( cb_never_changes_, 0, NULL, &cnc, 0, 0 ); + + // 投影行列のセットアップ + mat_projection_ = XMMatrixPerspectiveFovLH( XM_PIDIV4, client_width_ / client_height_, 0.01f, 100.0f ); + cb_change_on_resize ccor; + ccor.mProjection = XMMatrixTranspose( mat_projection_ ); + // 定数バッファに格納 + d3d_context_->UpdateSubresource( cb_change_on_resize_, 0, NULL, &ccor, 0, 0 ); + + init_ = true;// 初期化完了 + } + + void create_swap_chain_dependent_resources() + { // ビューの作成 THROW_IFERR(swap_chain_->GetBuffer(0,texture_.GetIID(),(void**)&texture_)); THROW_IFERR(d3d_device_->CreateRenderTargetView(texture_,0,&view_)); + texture_.Release(); + + // 深度バッファの作成 + D3D11_TEXTURE2D_DESC depth = {} ; + depth.Width = client_width_; + depth.Height = client_height_; + depth.MipLevels = 1; + depth.ArraySize = 1; + depth.Format = DXGI_FORMAT_D24_UNORM_S8_UINT; + depth.SampleDesc.Count = 1; + depth.SampleDesc.Quality = 0; + depth.Usage = D3D11_USAGE_DEFAULT; + depth.BindFlags = D3D11_BIND_DEPTH_STENCIL; + depth.CPUAccessFlags = 0; + depth.MiscFlags = 0; + THROW_IFERR(d3d_device_->CreateTexture2D( &depth, NULL, &depth_texture_ )); + + D3D11_DEPTH_STENCIL_VIEW_DESC dsv = {}; + dsv.Format = depth.Format; + dsv.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2D; + dsv.Texture2D.MipSlice = 0; + THROW_IFERR(d3d_device_->CreateDepthStencilView( depth_texture_, &dsv, &depth_view_ )); + + // OMステージに登録する + d3d_context_->OMSetRenderTargets( 1, &view_.GetInterfacePtr(), depth_view_ ); + + // ビューポートの設定 + D3D11_VIEWPORT vp; + vp.Width = client_width_; + vp.Height = client_height_; + vp.MinDepth = 0.0f; + vp.MaxDepth = 1.0f; + vp.TopLeftX = 0; + vp.TopLeftY = 0; + d3d_context_->RSSetViewports( 1, &vp ); + } + void discard_swap_chain_dependent_resources() + { + safe_release(depth_view_); + safe_release(depth_texture_); + safe_release(view_); + safe_release(texture_); + } + + virtual void create_device_independent_resources() { @@ -456,7 +773,7 @@ struct toplevel_window::impl : public base_win32_window //wic_imaging_factory_.CreateInstance(CLSID_WICImagingFactory); //thunk_proc_ = (WNDPROC)thunk_.getCode(); - layout_rect_ = D2D1::RectF(0.0f,0.0f,width_,height_); + layout_rect_ = D2D1::RectF(0.0f,0.0f,client_width_,client_height_); // Text Formatの作成 THROW_IFERR(write_factory_->CreateTextFormat( L"メイリオ", // Font family name. @@ -473,12 +790,53 @@ struct toplevel_window::impl : public base_win32_window void render(){ - static int t = 0; - if(swap_chain_) + static float t = 0.0f; + static DWORD time_start = 0; + + if(init_) { + // 表示 + swap_chain_->Present(1,0); + + float color[4] = { 0.7f, 0.0f, 0.0f, 1.0f }; + + // 描画ターゲットのクリア d3d_context_->ClearRenderTargetView(view_,color); - swap_chain_->Present(0,0); + // 深度バッファのクリア + d3d_context_->ClearDepthStencilView( depth_view_, D3D11_CLEAR_DEPTH, 1.0f, 0 ); + + DWORD time_count = GetTickCount(); + if( time_start == 0 ) + time_start = time_count; + t = ( time_count - time_start ) / 1000.0f; + + // Y軸で回転させる + mat_world_ = XMMatrixRotationY( t ); + + // 色の変更 + mesh_color_.x = ( sinf( t * 1.0f ) + 1.0f ) * 0.5f; + mesh_color_.y = ( cosf( t * 3.0f ) + 1.0f ) * 0.5f; + mesh_color_.z = ( sinf( t * 5.0f ) + 1.0f ) * 0.5f; + + + // 定数更新 + cb_changes_every_frame cb; + cb.mWorld = XMMatrixTranspose( mat_world_ ); + cb.vMeshColor = mesh_color_; + d3d_context_->UpdateSubresource( cb_changes_every_frame_, 0, NULL, &cb, 0, 0 ); + + // 立方体の描画 + d3d_context_->VSSetShader( v_shader_, NULL, 0 ); + d3d_context_->VSSetConstantBuffers( 0, 1, &cb_never_changes_.GetInterfacePtr() ); + d3d_context_->VSSetConstantBuffers( 1, 1, &cb_change_on_resize_.GetInterfacePtr() ); + d3d_context_->VSSetConstantBuffers( 2, 1, &cb_changes_every_frame_.GetInterfacePtr() ); + d3d_context_->PSSetShader( p_shader_, NULL, 0 ); + d3d_context_->PSSetConstantBuffers( 2, 1, &cb_changes_every_frame_.GetInterfacePtr() ); + d3d_context_->PSSetShaderResources( 0, 1, &shader_res_view_.GetInterfacePtr() ); + d3d_context_->PSSetSamplers( 0, 1, &sampler_state_.GetInterfacePtr() ); + d3d_context_->DrawIndexed( 36, 0, 0 ); + } // if (render_target_) @@ -528,7 +886,7 @@ struct toplevel_window::impl : public base_win32_window WS_EX_APPWINDOW | WS_EX_TOPMOST, name_.c_str(), title_.c_str(), - WS_OVERLAPPEDWINDOW , + WS_OVERLAPPEDWINDOW & ~WS_THICKFRAME, CW_USEDEFAULT, CW_USEDEFAULT, static_cast(dpi_.scale_x(width_)), @@ -612,7 +970,26 @@ private: ID3D11DeviceContextPtr d3d_context_; ID3D11Texture2DPtr texture_; ID3D11RenderTargetViewPtr view_; - + ID3D11Texture2DPtr depth_texture_; + ID3D11DepthStencilViewPtr depth_view_; + ID3D11VertexShaderPtr v_shader_; + ID3D11InputLayoutPtr input_layout_; + ID3D11PixelShaderPtr p_shader_; + ID3D11BufferPtr v_buffer_; + ID3D11BufferPtr i_buffer_; + ID3D11BufferPtr cb_never_changes_; + ID3D11BufferPtr cb_change_on_resize_; + ID3D11BufferPtr cb_changes_every_frame_; + ID3D11ShaderResourceViewPtr shader_res_view_; + ID3D11SamplerStatePtr sampler_state_; + + XMMATRIX mat_world_; + XMMATRIX mat_view_; + XMMATRIX mat_projection_; + XMFLOAT4 mesh_color_; + + float client_width_,client_height_; + //IDXGISwapChainPtr; ID2D1FactoryPtr factory_; ID2D1HwndRenderTargetPtr render_target_; @@ -621,6 +998,8 @@ private: IDWriteTextFormatPtr write_text_format_; IDXGISwapChainPtr swap_chain_; std::wstring dxgi_info_; + icon icon_; + bool init_; D2D1_RECT_F layout_rect_; D2D1_SIZE_U icon_size_; @@ -716,7 +1095,7 @@ private: return bitmap; } - + toplevel_window::toplevel_window(const std::wstring& menu_name,const std::wstring& name,bool fit_to_display,float width ,float height) : impl_(new impl(menu_name,name,fit_to_display,width,height)) { @@ -730,6 +1109,7 @@ private: bool toplevel_window::is_show(){return impl_->is_show();}; void toplevel_window::text(std::wstring& text){impl_->text(text);}; void toplevel_window::update(){impl_->update();}; + void toplevel_window::render(){impl_->render();}; toplevel_window_ptr create_toplevel_window ( @@ -741,7 +1121,10 @@ private: float height ) { - toplevel_window* p = new toplevel_window(menu_name,name,fit_to_display,width,height); +// クライアント領域のサイズからウィンドウサイズを設定 +RECT rect = { 0, 0, width, height }; +::AdjustWindowRectEx( &rect, WS_OVERLAPPEDWINDOW & ~WS_THICKFRAME, FALSE, 0 ); + toplevel_window* p = new toplevel_window(menu_name,name,fit_to_display,rect.right - rect.left,rect.bottom - rect.top); p->create(); p->show(); p->update(); diff --git a/dxgi_test/toplevel_window.h b/dxgi_test/toplevel_window.h index be81cd3..bd9c482 100644 --- a/dxgi_test/toplevel_window.h +++ b/dxgi_test/toplevel_window.h @@ -45,6 +45,7 @@ namespace sf void text(std::wstring& text); void update(); + void render(); private: struct impl;