OSDN Git Service

ライティングを実装 master
authorSFPGMR <sfpg@git.sourceforge.jp>
Tue, 12 Jul 2011 10:17:33 +0000 (19:17 +0900)
committerSFPGMR <sfpg@git.sourceforge.jp>
Tue, 12 Jul 2011 10:17:33 +0000 (19:17 +0900)
dxgi_test/Tutorial07.fx
dxgi_test/dxgi_test.fx [new file with mode: 0644]
dxgi_test/dxgi_test.vcxproj
dxgi_test/dxgi_test.vcxproj.filters
dxgi_test/toplevel_window.cpp

index 57623fe..1384a7c 100644 (file)
@@ -5,7 +5,7 @@
 //--------------------------------------------------------------------------------------
 
 //--------------------------------------------------------------------------------------
-// Constant Buffer Variables
+// \92è\90\94\83o\83b\83t\83@
 //--------------------------------------------------------------------------------------
 Texture2D txDiffuse : register( t0 );
 SamplerState samLinear : register( s0 );
@@ -13,6 +13,8 @@ SamplerState samLinear : register( s0 );
 cbuffer cbNeverChanges : register( b0 )
 {
     matrix View;
+       float4 vLightDir[2];
+       float4 vLightColor[2];
 };
 
 cbuffer cbChangeOnResize : register( b1 )
@@ -28,12 +30,14 @@ cbuffer cbChangesEveryFrame : register( b2 )
 
 
 //--------------------------------------------------------------------------------------
+// \92¸\93_\8fî\95ñ
 struct VS_INPUT
 {
     float4 Pos : POSITION;
     float2 Tex : TEXCOORD0;
 };
 
+// \83s\83N\83Z\83\8b\8fî\95ñ
 struct PS_INPUT
 {
     float4 Pos : SV_POSITION;
@@ -42,16 +46,22 @@ struct PS_INPUT
 
 
 //--------------------------------------------------------------------------------------
-// Vertex Shader
+// \92¸\93_\83V\83F\81[\83_\81[
 //--------------------------------------------------------------------------------------
 PS_INPUT VS( VS_INPUT input )
 {
-    PS_INPUT output = (PS_INPUT)0;
-    output.Pos = mul( input.Pos, World );
+    // \8fo\97Í\97p\95Ï\90\94\82Ì\8f\89\8aú\89»
+       PS_INPUT output = (PS_INPUT)0;
+
+       // \83\8d\81[\83J\83\8b\8dÀ\95W\82©\82ç\83\8f\81[\83\8b\83h\8dÀ\95W\82Ö\82Ì\95Ï\8a·
+    output.Pos = mul( input.Pos, World ); 
+       // \83J\83\81\83\89
     output.Pos = mul( output.Pos, View );
+       // \8eË\89e\95Ï\8a·
     output.Pos = mul( output.Pos, Projection );
+       // \83e\83N\83X\83`\83\83\83}\83b\83s\83\93\83O\82Ì\8dÀ\95W\95Ï\8a·\81i\8d¡\89ñ\82Í\95Ï\8a·\82Í\82µ\82È\82¢\81j
     output.Tex = input.Tex;
-    
+    // \8fo\97Í\82ð\95Ô\82·\81B
     return output;
 }
 
diff --git a/dxgi_test/dxgi_test.fx b/dxgi_test/dxgi_test.fx
new file mode 100644 (file)
index 0000000..b3b21af
--- /dev/null
@@ -0,0 +1,88 @@
+//--------------------------------------------------------------------------------------
+// File: Tutorial07.fx
+//
+// Copyright (c) Microsoft Corporation. All rights reserved.
+//--------------------------------------------------------------------------------------
+
+//--------------------------------------------------------------------------------------
+// \92è\90\94\83o\83b\83t\83@
+//--------------------------------------------------------------------------------------
+Texture2D txDiffuse : register( t0 );
+SamplerState samLinear : register( s0 );
+
+cbuffer cbNeverChanges : register( b0 )
+{
+    matrix View;
+       float4 vLightDir;
+       float4 vLightColor;
+};
+
+cbuffer cbChangeOnResize : register( b1 )
+{
+    matrix Projection;
+};
+
+cbuffer cbChangesEveryFrame : register( b2 )
+{
+    matrix World;
+ //   float4 vMeshColor;
+};
+
+
+//--------------------------------------------------------------------------------------
+// \92¸\93_\8fî\95ñ
+struct VS_INPUT
+{
+    float4 Pos : POSITION;
+    float3 Norm : NORMAL;
+    float2 Tex : TEXCOORD0;
+};
+
+// \83s\83N\83Z\83\8b\8fî\95ñ
+struct PS_INPUT
+{
+    float4 Pos : SV_POSITION;
+    float4 Color : COLOR0;
+    float2 Tex : TEXCOORD0;
+};
+
+
+//--------------------------------------------------------------------------------------
+// \92¸\93_\83V\83F\81[\83_\81[
+//--------------------------------------------------------------------------------------
+PS_INPUT VS( VS_INPUT input )
+{
+    // \8fo\97Í\97p\95Ï\90\94\82Ì\8f\89\8aú\89»
+       PS_INPUT output = (PS_INPUT)0;
+
+       // \83\8d\81[\83J\83\8b\8dÀ\95W\82©\82ç\83\8f\81[\83\8b\83h\8dÀ\95W\82Ö\82Ì\95Ï\8a·
+    output.Pos = mul( input.Pos, World ); 
+       // \83J\83\81\83\89
+    output.Pos = mul( output.Pos, View );
+       // \8eË\89e\95Ï\8a·
+    output.Pos = mul( output.Pos, Projection );
+       // \83e\83N\83X\83`\83\83\83}\83b\83s\83\93\83O\82Ì\8dÀ\95W\95Ï\8a·\81i\8d¡\89ñ\82Í\95Ï\8a·\82Í\82µ\82È\82¢\81j
+    output.Tex = input.Tex;
+
+       // \96@\90ü\83x\83N\83g\83\8b\82Ì\8cv\8eZ
+    output.Color = mul( input.Norm, World );
+
+       //\93à\90Ï\82Ì\8cv\8eZ
+       output.Color = dot( (float3)vLightDir,(float3)output.Color) * vLightColor;
+       output.Color.a = 1;
+
+    // \8fo\97Í\82ð\95Ô\82·\81B
+       return output;
+
+}
+
+
+//--------------------------------------------------------------------------------------
+// Pixel Shader
+//--------------------------------------------------------------------------------------
+float4 PS( PS_INPUT input) : SV_Target
+{
+    float4 finalColor = 0;
+    finalColor = saturate(input.Color) * txDiffuse.Sample( samLinear, input.Tex );
+    return finalColor;
+}
index a33e300..e95303b 100644 (file)
     <ResourceCompile Include="dxgi_test.rc" />
   </ItemGroup>
   <ItemGroup>
+    <None Include="dxgi_test.fx" />
     <None Include="icon1.ico" />
     <None Include="Tutorial07.fx" />
   </ItemGroup>
index 93f4ccb..1906da6 100644 (file)
@@ -86,6 +86,9 @@
     <None Include="Tutorial07.fx">
       <Filter>Shader</Filter>
     </None>
+    <None Include="dxgi_test.fx">
+      <Filter>Shader</Filter>
+    </None>
   </ItemGroup>
   <ItemGroup>
     <ResourceCompile Include="dxgi_test.rc" />
index a26051a..4f8c191 100644 (file)
@@ -183,12 +183,15 @@ std::vector<mode_info> scanline_orders =
 struct simple_vertex
 {
     XMFLOAT3 pos;
+    XMFLOAT3 norm;
     XMFLOAT2 tex;
 };
 
 struct cb_never_changes
 {
     XMMATRIX mView;
+         XMFLOAT4 vLightDir;
+         XMFLOAT4 vLightColor;
 };
 
 struct cb_change_on_resize
@@ -199,7 +202,7 @@ struct cb_change_on_resize
 struct cb_changes_every_frame
 {
     XMMATRIX mWorld;
-    XMFLOAT4 vMeshColor;
+//    XMFLOAT4 vMeshColor;
 };
 
 struct toplevel_window::impl : public base_win32_window
@@ -421,10 +424,23 @@ struct toplevel_window::impl : public base_win32_window
 
     THROW_IFERR(adapter_->EnumOutputs(0,&output_));
 
+    // MSAA
+    DXGI_SAMPLE_DESC msaa;
+         for(int i = 0; i <= D3D11_MAX_MULTISAMPLE_SAMPLE_COUNT; i++){
+                 UINT q;
+                 if SUCCEEDED(d3d_device_->CheckMultisampleQualityLevels(DXGI_FORMAT_D24_UNORM_S8_UINT, i, &q)){
+                         if(1 < q){
+                                 msaa.Count = i;
+                                 msaa.Quality = q - 1;
+          break;
+                         }
+                 }
+         }
+
     // 表示モード
     DXGI_MODE_DESC desired_desc = {} , actual_desc = {};
     // 各色8ビットで符号化なし正規化数
-    desired_desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
+    desired_desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM_SRGB;
     desired_desc.Height = client_height_;// 高さ
     desired_desc.Width = client_width_;// 幅
     desired_desc.Scaling = DXGI_MODE_SCALING_CENTERED;// スケーリングなし
@@ -442,6 +458,7 @@ struct toplevel_window::impl : public base_win32_window
       desc.SampleDesc.Count    = 1;
       desc.BufferUsage                 = DXGI_USAGE_RENDER_TARGET_OUTPUT;
       desc.BufferCount                 = 1;
+//      desc.SampleDesc = msaa;
       desc.OutputWindow                = hwnd_;
  //     desc.SwapEffect                        = DXGI_SWAP_EFFECT_;
       desc.Windowed                    = TRUE;
@@ -461,7 +478,7 @@ struct toplevel_window::impl : public base_win32_window
 #if defined( DEBUG ) || defined( _DEBUG )
       compile_flag |= D3DCOMPILE_DEBUG;
 #endif
-      HRESULT hr = D3DX11CompileFromFile( L"Tutorial07.fx", NULL, NULL, "VS", "vs_4_0", 
+      HRESULT hr = D3DX11CompileFromFile( L"dxgi_test.fx", NULL, NULL, "VS", "vs_5_0", 
          compile_flag, 0, NULL, &vsblob, &vserrblob, NULL );
       if( FAILED( hr ) )
       {
@@ -477,11 +494,13 @@ struct toplevel_window::impl : public base_win32_window
       // 入力頂点レイアウトの定義
       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 }};
+      { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 },
+      { "NORMAL", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 },
+      { "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 }};
+      ;
 
       // 入力頂点レイアウトの生成
-      THROW_IFERR(d3d_device_->CreateInputLayout( layout, 2, vsblob->GetBufferPointer(),
+      THROW_IFERR(d3d_device_->CreateInputLayout( layout, ARRAYSIZE(layout), vsblob->GetBufferPointer(),
                                           vsblob->GetBufferSize(), &input_layout_ ));
       vsblob.Release();
     }
@@ -496,7 +515,7 @@ struct toplevel_window::impl : public base_win32_window
 #if defined( DEBUG ) || defined( _DEBUG )
       compile_flag |= D3DCOMPILE_DEBUG;
 #endif
-      HRESULT hr = D3DX11CompileFromFile( L"Tutorial07.fx", NULL, NULL, "PS", "ps_4_0", 
+      HRESULT hr = D3DX11CompileFromFile( L"dxgi_test.fx", NULL, NULL, "PS", "ps_5_0", 
          compile_flag, 0, NULL, &psblob, &pserror, NULL );
       if( FAILED( hr ) )
       {
@@ -516,35 +535,35 @@ struct toplevel_window::impl : public base_win32_window
  // 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 ) },
+        { XMFLOAT3( -1.0f, 1.0f, -1.0f ), XMFLOAT3( 0.0f, 1.0f, 0.0f ),XMFLOAT2( 0.0f, 0.0f ) },
+        { XMFLOAT3( 1.0f, 1.0f, -1.0f ),XMFLOAT3( 0.0f, 1.0f, 0.0f ), XMFLOAT2( 1.0f, 0.0f ) },
+        { XMFLOAT3( 1.0f, 1.0f, 1.0f ),XMFLOAT3( 0.0f, 1.0f, 0.0f ), XMFLOAT2( 1.0f, 1.0f ) },
+        { XMFLOAT3( -1.0f, 1.0f, 1.0f ), XMFLOAT3( 0.0f, 1.0f, 0.0f ) ,XMFLOAT2( 0.0f, 1.0f ) },
+
+        { XMFLOAT3( -1.0f, -1.0f, -1.0f ),XMFLOAT3( 0.0f, -1.0f, 0.0f ), XMFLOAT2( 0.0f, 0.0f ) },
+        { XMFLOAT3( 1.0f, -1.0f, -1.0f ),  XMFLOAT3( 0.0f, -1.0f, 0.0f ) ,XMFLOAT2( 1.0f, 0.0f ) },
+        { XMFLOAT3( 1.0f, -1.0f, 1.0f ), XMFLOAT3( 0.0f, -1.0f, 0.0f ) , XMFLOAT2( 1.0f, 1.0f ) },
+        { XMFLOAT3( -1.0f, -1.0f, 1.0f ), XMFLOAT3( 0.0f, -1.0f, 0.0f ),XMFLOAT2( 0.0f, 1.0f ) },
+
+        { XMFLOAT3( -1.0f, -1.0f, 1.0f ),XMFLOAT3( -1.0f, 0.0f, 0.0f ) , XMFLOAT2( 0.0f, 0.0f ) },
+        { XMFLOAT3( -1.0f, -1.0f, -1.0f ),XMFLOAT3( -1.0f, 0.0f, 0.0f ), XMFLOAT2( 1.0f, 0.0f ) },
+        { XMFLOAT3( -1.0f, 1.0f, -1.0f ), XMFLOAT3( -1.0f, 0.0f, 0.0f ),XMFLOAT2( 1.0f, 1.0f ) },
+        { XMFLOAT3( -1.0f, 1.0f, 1.0f ),XMFLOAT3( -1.0f, 0.0f, 0.0f ), XMFLOAT2( 0.0f, 1.0f ) },
+
+        { XMFLOAT3( 1.0f, -1.0f, 1.0f ),XMFLOAT3( 1.0f, 0.0f, 0.0f ), XMFLOAT2( 0.0f, 0.0f ) },
+        { XMFLOAT3( 1.0f, -1.0f, -1.0f ),XMFLOAT3( 1.0f, 0.0f, 0.0f ), XMFLOAT2( 1.0f, 0.0f ) },
+        { XMFLOAT3( 1.0f, 1.0f, -1.0f ),XMFLOAT3( 1.0f, 0.0f, 0.0f ), XMFLOAT2( 1.0f, 1.0f ) },
+        { XMFLOAT3( 1.0f, 1.0f, 1.0f ),XMFLOAT3( 1.0f, 0.0f, 0.0f ), XMFLOAT2( 0.0f, 1.0f ) },
+
+        { XMFLOAT3( -1.0f, -1.0f, -1.0f ),XMFLOAT3( 0.0f, 0.0f, -1.0f ) , XMFLOAT2( 0.0f, 0.0f ) },
+        { XMFLOAT3( 1.0f, -1.0f, -1.0f ),XMFLOAT3( 0.0f, 0.0f, -1.0f ), XMFLOAT2( 1.0f, 0.0f ) },
+        { XMFLOAT3( 1.0f, 1.0f, -1.0f ),XMFLOAT3( 0.0f, 0.0f, -1.0f ), XMFLOAT2( 1.0f, 1.0f ) },
+        { XMFLOAT3( -1.0f, 1.0f, -1.0f ),XMFLOAT3( 0.0f, 0.0f, -1.0f ) , XMFLOAT2( 0.0f, 1.0f ) },
+
+        { XMFLOAT3( -1.0f, -1.0f, 1.0f ), XMFLOAT3( 0.0f, 0.0f, 1.0f ) , XMFLOAT2( 0.0f, 0.0f ) },
+        { XMFLOAT3( 1.0f, -1.0f, 1.0f ), XMFLOAT3( 0.0f, 0.0f, 1.0f ) , XMFLOAT2( 1.0f, 0.0f ) },
+        { XMFLOAT3( 1.0f, 1.0f, 1.0f ),XMFLOAT3( 0.0f, 0.0f, 1.0f ), XMFLOAT2( 1.0f, 1.0f ) },
+        { XMFLOAT3( -1.0f, 1.0f, 1.0f ), XMFLOAT3( 0.0f, 0.0f, 1.0f ),XMFLOAT2( 0.0f, 1.0f ) }
     };
     //std::vector<simple_vertex> vertices = boost::assign::list_of<simple_vertex>
     //
@@ -668,6 +687,8 @@ struct toplevel_window::impl : public base_win32_window
     mat_view_ = XMMatrixLookAtLH( eye, at, up );
     cb_never_changes cnc;
     cnc.mView = XMMatrixTranspose( mat_view_ );
+    cnc.vLightColor = XMFLOAT4( 0.5f, 0.5f, 0.5f, 1.0f );
+    cnc.vLightDir =  XMFLOAT4(-0.577f, 0.577f, -0.577f, 1.0f);
     // 定数バッファに格納
     d3d_context_->UpdateSubresource( cb_never_changes_, 0, NULL, &cnc, 0, 0 );
 
@@ -791,6 +812,7 @@ struct toplevel_window::impl : public base_win32_window
   void render(){
 
     static float t = 0.0f;
+
     static DWORD time_start = 0;
 
     if(init_)
@@ -823,7 +845,7 @@ struct toplevel_window::impl : public base_win32_window
       // 定数更新
       cb_changes_every_frame cb;
       cb.mWorld = XMMatrixTranspose( mat_world_ );
-      cb.vMeshColor = mesh_color_;
+//      cb.vMeshColor = mesh_color_;
       d3d_context_->UpdateSubresource( cb_changes_every_frame_, 0, NULL, &cb, 0, 0 );
 
       // 立方体の描画
@@ -835,8 +857,10 @@ struct toplevel_window::impl : public base_win32_window
       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_)