From: SFPGMR Date: Tue, 12 Jul 2011 10:17:33 +0000 (+0900) Subject: ライティングを実装 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=HEAD;hp=93368a228f964674d77a416a88b6a45ac816683c;p=shooting3%2Fdxgi_test.git ライティングを実装 --- diff --git a/dxgi_test/Tutorial07.fx b/dxgi_test/Tutorial07.fx index 57623fe..1384a7c 100644 --- a/dxgi_test/Tutorial07.fx +++ b/dxgi_test/Tutorial07.fx @@ -5,7 +5,7 @@ //-------------------------------------------------------------------------------------- //-------------------------------------------------------------------------------------- -// Constant Buffer Variables +// ’萔ƒoƒbƒtƒ@ //-------------------------------------------------------------------------------------- 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 ) //-------------------------------------------------------------------------------------- +// ’¸“_î•ñ struct VS_INPUT { float4 Pos : POSITION; float2 Tex : TEXCOORD0; }; +// ƒsƒNƒZƒ‹î•ñ struct PS_INPUT { float4 Pos : SV_POSITION; @@ -42,16 +46,22 @@ struct PS_INPUT //-------------------------------------------------------------------------------------- -// Vertex Shader +// ’¸“_ƒVƒF[ƒ_[ //-------------------------------------------------------------------------------------- PS_INPUT VS( VS_INPUT input ) { - PS_INPUT output = (PS_INPUT)0; - output.Pos = mul( input.Pos, World ); + // o—Í—p•Ï”‚̏‰Šú‰» + PS_INPUT output = (PS_INPUT)0; + + // ƒ[ƒJƒ‹À•W‚©‚烏[ƒ‹ƒhÀ•W‚Ö‚Ì•ÏŠ· + output.Pos = mul( input.Pos, World ); + // ƒJƒƒ‰ output.Pos = mul( output.Pos, View ); + // ŽË‰e•ÏŠ· output.Pos = mul( output.Pos, Projection ); + // ƒeƒNƒXƒ`ƒƒƒ}ƒbƒsƒ“ƒO‚̍À•W•ÏŠ·i¡‰ñ‚Í•ÏŠ·‚Í‚µ‚È‚¢j output.Tex = input.Tex; - + // o—Í‚ð•Ô‚·B return output; } diff --git a/dxgi_test/dxgi_test.fx b/dxgi_test/dxgi_test.fx new file mode 100644 index 0000000..b3b21af --- /dev/null +++ b/dxgi_test/dxgi_test.fx @@ -0,0 +1,88 @@ +//-------------------------------------------------------------------------------------- +// File: Tutorial07.fx +// +// Copyright (c) Microsoft Corporation. All rights reserved. +//-------------------------------------------------------------------------------------- + +//-------------------------------------------------------------------------------------- +// ’萔ƒoƒbƒtƒ@ +//-------------------------------------------------------------------------------------- +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; +}; + + +//-------------------------------------------------------------------------------------- +// ’¸“_î•ñ +struct VS_INPUT +{ + float4 Pos : POSITION; + float3 Norm : NORMAL; + float2 Tex : TEXCOORD0; +}; + +// ƒsƒNƒZƒ‹î•ñ +struct PS_INPUT +{ + float4 Pos : SV_POSITION; + float4 Color : COLOR0; + float2 Tex : TEXCOORD0; +}; + + +//-------------------------------------------------------------------------------------- +// ’¸“_ƒVƒF[ƒ_[ +//-------------------------------------------------------------------------------------- +PS_INPUT VS( VS_INPUT input ) +{ + // o—Í—p•Ï”‚̏‰Šú‰» + PS_INPUT output = (PS_INPUT)0; + + // ƒ[ƒJƒ‹À•W‚©‚烏[ƒ‹ƒhÀ•W‚Ö‚Ì•ÏŠ· + output.Pos = mul( input.Pos, World ); + // ƒJƒƒ‰ + output.Pos = mul( output.Pos, View ); + // ŽË‰e•ÏŠ· + output.Pos = mul( output.Pos, Projection ); + // ƒeƒNƒXƒ`ƒƒƒ}ƒbƒsƒ“ƒO‚̍À•W•ÏŠ·i¡‰ñ‚Í•ÏŠ·‚Í‚µ‚È‚¢j + output.Tex = input.Tex; + + // –@üƒxƒNƒgƒ‹‚ÌŒvŽZ + output.Color = mul( input.Norm, World ); + + //“àÏ‚ÌŒvŽZ + output.Color = dot( (float3)vLightDir,(float3)output.Color) * vLightColor; + output.Color.a = 1; + + // o—Í‚ð•Ô‚·B + 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; +} diff --git a/dxgi_test/dxgi_test.vcxproj b/dxgi_test/dxgi_test.vcxproj index a33e300..e95303b 100644 --- a/dxgi_test/dxgi_test.vcxproj +++ b/dxgi_test/dxgi_test.vcxproj @@ -190,6 +190,7 @@ + diff --git a/dxgi_test/dxgi_test.vcxproj.filters b/dxgi_test/dxgi_test.vcxproj.filters index 93f4ccb..1906da6 100644 --- a/dxgi_test/dxgi_test.vcxproj.filters +++ b/dxgi_test/dxgi_test.vcxproj.filters @@ -86,6 +86,9 @@ Shader + + Shader + diff --git a/dxgi_test/toplevel_window.cpp b/dxgi_test/toplevel_window.cpp index a26051a..4f8c191 100644 --- a/dxgi_test/toplevel_window.cpp +++ b/dxgi_test/toplevel_window.cpp @@ -183,12 +183,15 @@ std::vector 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 vertices = boost::assign::list_of // @@ -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_)