OSDN Git Service

レイヤードウィンドウにおけるテストは終了。
[winaudioj/winwrapper.git] / winwrapper / sf_windows.cpp
index ac72b52..3df3b5f 100644 (file)
@@ -482,8 +482,8 @@ namespace sf
 \r
     //}\r
 \r
-    // \r
-    \r
+    // バックバッファの作成\r
+  \r
     D3D11_TEXTURE2D_DESC desc = {0};\r
     desc.Width = actual_desc_.Width;\r
     desc.Height = actual_desc_.Height;\r
@@ -730,6 +730,58 @@ namespace sf
     // 定数バッファに格納\r
     d3d_context_->UpdateSubresource( cb_change_on_resize_, 0, NULL, &ccor, 0, 0 );\r
 \r
+    // 動的テクスチャの生成\r
+    {\r
+      D3D11_TEXTURE2D_DESC desc = {0};\r
+      desc.Width = 256;\r
+      desc.Height = 256;\r
+      desc.Format = actual_desc_.Format;\r
+      desc.MipLevels = 1;\r
+      desc.SampleDesc.Count = 1;\r
+      desc.SampleDesc.Quality = 0;\r
+      desc.ArraySize = 1;\r
+      desc.Usage = D3D11_USAGE_DEFAULT;\r
+      desc.BindFlags = D3D11_BIND_RENDER_TARGET | D3D11_BIND_SHADER_RESOURCE;\r
+      // desc.MiscFlags = D3D11_RESOURCE_MISC_GDI_COMPATIBLE;\r
+      THROW_IF_ERR(d3d_device_->CreateTexture2D(&desc,NULL,&cube_texture_));\r
+      THROW_IF_ERR(d3d_device_->CreateRenderTargetView(cube_texture_,0,&cube_view_));\r
+\r
+      // 深度バッファの作成\r
+      D3D11_TEXTURE2D_DESC depth = {} ;\r
+      depth.Width = desc.Width;//rc.right - rc.left;client_width_;\r
+      depth.Height = desc.Height;//rc.bottom - rc.top;client_height_;\r
+      depth.MipLevels = 1;\r
+      depth.ArraySize = 1;\r
+      depth.Format = DXGI_FORMAT_D24_UNORM_S8_UINT;\r
+      depth.SampleDesc.Count = 1;\r
+      depth.SampleDesc.Quality = 0;\r
+      depth.Usage = D3D11_USAGE_DEFAULT;\r
+      depth.BindFlags = D3D11_BIND_DEPTH_STENCIL;\r
+      depth.CPUAccessFlags = 0;\r
+      depth.MiscFlags = 0;\r
+      THROW_IF_ERR(d3d_device_->CreateTexture2D( &depth, NULL, &cube_depth_texture_ ));\r
+\r
+      D3D11_DEPTH_STENCIL_VIEW_DESC dsv = {};\r
+      dsv.Format = depth.Format;\r
+      dsv.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2D;\r
+      dsv.Texture2D.MipSlice = 0;\r
+      THROW_IF_ERR(d3d_device_->CreateDepthStencilView( cube_depth_texture_, &dsv, &cube_depth_view_ ));\r
+      THROW_IF_ERR(d3d_device_->CreateShaderResourceView(cube_texture_,0,&cube_shader_res_view_));\r
+\r
+      D3D11_SAMPLER_DESC sdesc = {};\r
+      sdesc.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR;\r
+      sdesc.AddressU = D3D11_TEXTURE_ADDRESS_WRAP;\r
+      sdesc.AddressV = D3D11_TEXTURE_ADDRESS_WRAP;\r
+      sdesc.AddressW = D3D11_TEXTURE_ADDRESS_WRAP;\r
+      sdesc.ComparisonFunc = D3D11_COMPARISON_NEVER;\r
+      sdesc.MinLOD = 0;\r
+      sdesc.MaxLOD = D3D11_FLOAT32_MAX;\r
+      THROW_IFERR(d3d_device_->CreateSamplerState( &sdesc, &cube_sampler_state_ ));\r
+      cube_mat_projection_ = XMMatrixPerspectiveFovLH( XM_PIDIV4, /*(rc.right - rc.left)/(rc.bottom - rc.top)*/256 / 256, 0.01f, 100.0f );\r
+\r
+    }\r
+    // \r
+\r
     init_ = true;// 初期化完了\r
   }\r
 \r
@@ -771,7 +823,7 @@ namespace sf
 \r
     // OMステージに登録する\r
     // d3d_context_->OMSetRenderTargets( 1, &view_.GetInterfacePtr(), depth_view_ );\r
-    d3d_context_->OMSetRenderTargets( 1, &view_.GetInterfacePtr(), depth_view_ );\r
+    // d3d_context_->OMSetRenderTargets( 1, &view_.GetInterfacePtr(), depth_view_ );\r
 \r
     // ビューポートの設定\r
     D3D11_VIEWPORT vp;\r
@@ -807,11 +859,19 @@ namespace sf
     safe_release(input_layout_);\r
     safe_release(v_shader_);\r
     discard_swapchain_dependent_resources();\r
+    safe_release(back_buffer_);\r
+    safe_release(cube_sampler_state_);\r
+    safe_release(cube_shader_res_view_);\r
+    safe_release(cube_view_);\r
+    safe_release(cube_depth_view_);\r
+    safe_release(cube_texture_);\r
+    safe_release(cube_depth_texture_);\r
     //safe_release(render_target_);\r
 //    safe_release(swap_chain_);\r
     safe_release(d3d_context_);\r
     safe_release(d3d_device_);\r
     safe_release(adapter_);\r
+\r
   }\r
 \r
   template <typename ProcType> \r
@@ -969,13 +1029,13 @@ namespace sf
     if(init_)\r
     {\r
 \r
-      float color[4] = { 0.0f, 0.0f, 1.0f, 1.0f };    \r
-\r
+      float cube_color[4] = { 0.0f, 0.0f, 1.0f, 0.5f };    \r
 \r
       // 描画ターゲットのクリア\r
-      d3d_context_->ClearRenderTargetView(view_,color);\r
+      d3d_context_->ClearRenderTargetView(cube_view_,cube_color);\r
       // 深度バッファのクリア\r
-      d3d_context_->ClearDepthStencilView( depth_view_, D3D11_CLEAR_DEPTH, 1.0f, 0 );\r
+      d3d_context_->ClearDepthStencilView( cube_depth_view_, D3D11_CLEAR_DEPTH, 1.0f, 0 );\r
+\r
 \r
       DWORD time_count = GetTickCount();\r
       if( time_start == 0 )\r
@@ -998,6 +1058,12 @@ namespace sf
       cb.vLightColor = mesh_color_;\r
       d3d_context_->UpdateSubresource( cb_changes_every_frame_, 0, NULL, &cb, 0, 0 );\r
 \r
+      cb_change_on_resize ccor;\r
+      ccor.mProjection = XMMatrixTranspose( cube_mat_projection_ );\r
+      // 定数バッファに格納\r
+      d3d_context_->UpdateSubresource( cb_change_on_resize_, 0, NULL, &ccor, 0, 0 );\r
+\r
+\r
       // 立方体の描画\r
       d3d_context_->VSSetShader( v_shader_, NULL, 0 );\r
       d3d_context_->VSSetConstantBuffers( 0, 1, &cb_never_changes_.GetInterfacePtr() );\r
@@ -1008,6 +1074,48 @@ namespace sf
       d3d_context_->PSSetShaderResources( 0, 1, &shader_res_view_.GetInterfacePtr() );\r
       d3d_context_->PSSetSamplers( 0, 1, &sampler_state_.GetInterfacePtr() );\r
 \r
+      d3d_context_->OMSetRenderTargets( 1, &cube_view_.GetInterfacePtr(), cube_depth_view_ );\r
+\r
+      // ビューポートの設定\r
+      D3D11_VIEWPORT vp;\r
+      vp.Width = 256;//client_width_;\r
+      vp.Height = 256;//client_height_;\r
+      vp.MinDepth = 0.0f;\r
+      vp.MaxDepth = 1.0f;\r
+      vp.TopLeftX = 0;\r
+      vp.TopLeftY = 0;\r
+      d3d_context_->RSSetViewports( 1, &vp );\r
+\r
+      d3d_context_->DrawIndexed( 36, 0, 0 );\r
+\r
+      d3d_context_->OMSetRenderTargets( 1, &view_.GetInterfacePtr(), depth_view_ );\r
+\r
+      float color[4] = { 1.0f, 0.0f, 0.0f, 0.0f };    \r
+      // 描画ターゲットのクリア\r
+      d3d_context_->ClearRenderTargetView(view_,color);\r
+      // 深度バッファのクリア\r
+      d3d_context_->ClearDepthStencilView( depth_view_, D3D11_CLEAR_DEPTH, 1.0f, 0 );\r
+\r
+      d3d_context_->PSSetShaderResources( 0, 1, &cube_shader_res_view_.GetInterfacePtr() );\r
+      d3d_context_->PSSetSamplers( 0, 1, &cube_sampler_state_.GetInterfacePtr() );\r
+\r
+\r
+      // ビューポートの設定\r
+      vp.Width = width_;//client_width_;\r
+      vp.Height = height_;//client_height_;\r
+      vp.MinDepth = 0.0f;\r
+      vp.MaxDepth = 1.0f;\r
+      vp.TopLeftX = 0;\r
+      vp.TopLeftY = 0;\r
+\r
+      d3d_context_->RSSetViewports( 1, &vp );\r
+\r
+      //cb_change_on_resize ccor;\r
+      ccor.mProjection = XMMatrixTranspose( mat_projection_ );\r
+      // 定数バッファに格納\r
+      d3d_context_->UpdateSubresource( cb_change_on_resize_, 0, NULL, &ccor, 0, 0 );\r
+\r
+\r
       d3d_context_->DrawIndexed( 36, 0, 0 );\r
 \r
       // 表示\r
@@ -1031,13 +1139,13 @@ namespace sf
       BLENDFUNCTION blend;\r
       blend.BlendOp = AC_SRC_OVER;\r
       blend.BlendFlags = 0;\r
-      blend.SourceConstantAlpha = 200; // 不透明度(レイヤードウィンドウ全体のアルファ値)\r
-      blend.AlphaFormat = AC_SRC_ALPHA;\r
+      blend.SourceConstantAlpha = 128; // 不透明度(レイヤードウィンドウ全体のアルファ値)\r
+      blend.AlphaFormat = 0;//AC_SRC_ALPHA;\r
       // デバイスコンテキストにおけるレイヤの位置\r
       POINT po;\r
       po.x = po.y = 0;\r
       BOOL err;\r
-      err = UpdateLayeredWindow(hwnd_, ddc.get(), &wnd_pos, &wnd_size, sdc, &po, RGB(255,0,0), &blend, ULW_ALPHA | ULW_COLORKEY);\r
+      err = UpdateLayeredWindow(hwnd_, ddc.get(), &wnd_pos, &wnd_size, sdc, &po, RGB(255,0,0), &blend, ULW_ALPHA | ULW_COLORKEY );\r
       BOOST_ASSERT(err == TRUE);\r
       surface->ReleaseDC( NULL);\r
       surface.Release();\r