std::string get_error_message_format(int error_code) { NL_ASSERT(error_code < 0); NL_ASSERT(NLDB_ERROR_CODE_START < 0); NL_ASSERT(NLDB_ERROR_CODE_END < 0); NL_ASSERT(NLDB_ERROR_CODE_START > NLDB_ERROR_CODE_END); // Is the error code in the range the one defined in Nanolat Database Engine? if ( NLDB_ERROR_CODE_START >= error_code && error_code >= NLDB_ERROR_CODE_END ) { std::string message = db::get_nldb_error_message_format(error_code); return message; } NL_ASSERT(NL_ERROR_CODE_START < 0); NL_ASSERT(NL_ERROR_CODE_END < 0); NL_ASSERT(NL_ERROR_CODE_START > NL_ERROR_CODE_END); // Is the error code in the range the one defined in the Database Server? if ( NL_ERROR_CODE_START >= error_code && error_code >= NL_ERROR_CODE_END ) { // Index in the nldb_error_message_format. int index = NL_ERROR_CODE_START - error_code; std::string message = std::string( server_error_message_format[index] ); return message; } // Never should come here. NL_ASSERT(0); return std::string("Unknown Error"); }
static void createVS( unsigned int target, const ShaderScripts& ss, nlEngineContext& cxt ) { const ShaderScript& shaderScript = ss.vsScripts.scripts[target]; const nlInt8* script = shaderScript.script; const nlInt8* funcName = "main"; const nlInt8* unitName = shaderScript.name; nlVertexShader& vs = cxt.vss[target]; NL_ASSERT( !vs.shader_ ); /**/ ID3DBlob* pBlob = NULL; ID3DBlob* pErrorBlob = NULL; /* commonと連結 */ const nlInt8* commonScript = ss.commonScripts.script; const nlUint32 scriptLen = nlStrlen( script ) + nlStrlen( commonScript ); nlInt8* conbinedScript = (nlInt8*)nlMalloc( (scriptLen+1)*sizeof(nlInt8) ); nlStrcat( conbinedScript, commonScript ); nlStrcat( conbinedScript, script ); //printf( conbinedScript ); #ifndef INTROMODE const DWORD flag = D3D10_SHADER_ENABLE_STRICTNESS | D3D10_SHADER_PACK_MATRIX_ROW_MAJOR; HRESULT hr = D3D10CompileShader( conbinedScript, nlStrlen(conbinedScript), unitName, shaderMacros, NULL, funcName, "vs_4_0", flag, &pBlob, &pErrorBlob ); /* ロードが失敗したらエラーを出力した後に確実にロードが成功するシェーダをロードする */ if(FAILED( hr ) ) { /**/ NL_ERR( ERR_005, (nlInt8*)pErrorBlob->GetBufferPointer() ); /**/ const nlInt8 script[] = { "cbuffer Const0 : register(b0){ f4x4 world; }" "cbuffer Const2 : register(b2){ f4x4 viewProj; }" "float4 main( float4 in_pos:P, float4 in_normal:N, float4 in_col:C ):SV_POSITION" "{ return mul( in_pos, mul(world,viewProj)); }" }; HRESULT hr = D3D10CompileShader( script, sizeof(script)/sizeof(nlInt8), unitName, shaderMacros, NULL, "main", "vs_4_0", flag, &pBlob, &pErrorBlob ); } #else const DWORD flag = D3D10_SHADER_ENABLE_STRICTNESS | D3D10_SHADER_PACK_MATRIX_ROW_MAJOR | D3D10_SHADER_OPTIMIZATION_LEVEL3; HRESULT hr = D3DX11CompileFromMemory( conbinedScript, nlStrlen(conbinedScript), funcName, shaderMacros, NULL, funcName, "vs_4_0", flag, 0, NULL, &pBlob, &pErrorBlob, NULL ); if(FAILED( hr ) ) { MessageBoxA(NULL,(nlInt8*)pErrorBlob->GetBufferPointer(),"",MB_OK); } #endif /**/ nlFree( (void*)conbinedScript ); /* create shader */ NL_HR_VALID( cxt.d3dDevice->CreateVertexShader(pBlob->GetBufferPointer(), pBlob->GetBufferSize(), NULL, &vs.shader_ ) ); /* create inputlayout */ NL_HR_VALID( cxt.d3dDevice->CreateInputLayout(NLM_INPUT_ELEMENT, _countof(NLM_INPUT_ELEMENT), pBlob->GetBufferPointer(), pBlob->GetBufferSize(), &vs.inputLayout_ ) ); }
/* PSの生成 */ static void createPS( unsigned int target, const ShaderScripts& ss, nlEngineContext& cxt ) { /**/ ID3DBlob* pBlob = NULL; ID3DBlob* pErrorBlob = NULL; nlPixelShader& pixelShader = cxt.pss[target]; const nlInt8* script = ss.psScripts.scripts[target].script; const nlInt8* funcName = "main"; /**/ NL_ASSERT(!pixelShader.shader_); /* commonと連結 */ const nlInt8* commonScript = ss.commonScripts.script; const unsigned int scriptLen = nlStrlen( script ) + nlStrlen( commonScript ); nlInt8* conbinedScript = (nlInt8*)nlMalloc( (scriptLen+1)*sizeof(nlInt8) ); nlStrcat( conbinedScript, commonScript ); nlStrcat( conbinedScript, script ); #ifndef INTROMODE const DWORD flag = D3D10_SHADER_ENABLE_STRICTNESS | D3D10_SHADER_PACK_MATRIX_ROW_MAJOR; HRESULT hr = D3D10CompileShader( conbinedScript, nlStrlen(conbinedScript), funcName, shaderMacros, NULL, funcName, "ps_4_0", flag, &pBlob, &pErrorBlob ); if( SUCCEEDED(hr) ) { if( SUCCEEDED( cxt.d3dDevice->CreatePixelShader(pBlob->GetBufferPointer(), pBlob->GetBufferSize(), NULL, &pixelShader.shader_ ) ) ) { return ;} else { NL_ASSERT(!"このパスには来ないことになっている"); //goto RELOAD; return ; } } else { /* 失敗した場合はエラーを出力し確実に成功するシェーダをロードする */ const nlInt8* name = ss.psScripts.scripts[target].name; std::string error = std::string("[")+std::string(name)+std::string("]")+std::string(DXGetErrorDescriptionA(hr)); error.resize(error.size()-1);/* 改行コードを取り除く */ if(pErrorBlob) { error += std::string( (nlInt8*)pErrorBlob->GetBufferPointer() ); error.resize(error.size()-1);/* 改行コードを取り除く */ } NL_ERR( ERR_006, error.c_str()); /**/ const nlInt8 script[] = { "float4 main():SV_Target0" "{return float4(1,0,0,1);}" }; pixelShader = nlCreatePixelShader(script, sizeof(script)/sizeof(nlInt8), "main", cxt ); } return; #else const DWORD flag = D3D10_SHADER_ENABLE_STRICTNESS | D3D10_SHADER_PACK_MATRIX_ROW_MAJOR | D3D10_SHADER_OPTIMIZATION_LEVEL3; HRESULT hr = D3D10CompileShader( conbinedScript, nlStrlen(conbinedScript), funcName, shaderMacros, NULL, funcName, "ps_4_0", flag, &pBlob, &pErrorBlob ); if( FAILED(hr) ) { MessageBox( NULL, "failed to load pixel shader", "", MB_OK ); if(pErrorBlob) { MessageBox( NULL, (nlInt8*)pErrorBlob->GetBufferPointer(), "", MB_OK ); } return; } NL_HR_VALID( cxt.d3dDevice->CreatePixelShader(pBlob->GetBufferPointer(), pBlob->GetBufferSize(), NULL, &pixelShader.shader_ ) ); #endif }
/* GSの生成 */ static void createGS( nlUint32 target, const ShaderScripts& ss, nlEngineContext& cxt ) { /**/ ID3DBlob* pBlob = NULL; ID3DBlob* pErrorBlob = NULL; nlGeometoryShader& geometoryShader = cxt.gss[target]; const nlInt8* script = ss.gsScripts.scripts[target].script; const nlInt8* funcName = "main"; /**/ NL_ASSERT(!geometoryShader.shader); /* commonと連結 */ const nlInt8* commonScript = ss.commonScripts.script; const nlUint32 scriptLen = nlStrlen( script ) + nlStrlen( commonScript ); nlInt8* conbinedScript = (nlInt8*)nlMalloc( (scriptLen+1)*sizeof(nlInt8) ); nlStrcat( conbinedScript, commonScript ); nlStrcat( conbinedScript, script ); #ifndef INTROMODE const DWORD flag = D3D10_SHADER_ENABLE_STRICTNESS | D3D10_SHADER_PACK_MATRIX_ROW_MAJOR; HRESULT hr = D3D10CompileShader( conbinedScript, nlStrlen(conbinedScript), funcName, shaderMacros, NULL, funcName, "gs_4_0", flag, &pBlob, &pErrorBlob); if( SUCCEEDED(hr) ) { if( SUCCEEDED( cxt.d3dDevice->CreateGeometryShader(pBlob->GetBufferPointer(), pBlob->GetBufferSize(), NULL, &geometoryShader.shader ) ) ) { return ;} else { NL_ASSERT(!"このパスには来ないことになっている"); //goto RELOAD; return ; } } else { /* 失敗した場合はエラーを出力し確実に成功するシェーダをロードする */ const nlInt8* name = ss.gsScripts.scripts[target].name; std::string error = std::string("[")+std::string(name)+std::string("]")+std::string(DXGetErrorDescriptionA(hr)); error.resize(error.size()-1);/* 改行コードを取り除く */ if(pErrorBlob) { error += std::string( (nlInt8*)pErrorBlob->GetBufferPointer() ); error.resize(error.size()-1);/* 改行コードを取り除く */ } NL_ERR( ERR_006, error.c_str()); /**/ const nlInt8 script[] = { "struct GSSceneIn\n" "{\n" " float4 Pos : POS;\n" " float3 Norm : NORMAL;\n" " float2 Tex : TEXCOORD0;\n" "};\n" "struct PSSceneIn\n" "{\n" " float4 Pos : SV_Position;\n" " float3 Norm : TEXCOORD0;\n" " float2 Tex : TEXCOORD1;\n" "};\n" "[maxvertexcount(3)]\n" "void GSScene( triangleadj GSSceneIn input[6], inout TriangleStream<PSSceneIn> OutputStream )\n" "{\n" " PSSceneIn output = (PSSceneIn)0;\n" " for( uint i=0; i<6; i+=2 )\n" " {\n" " output.Pos = input[i].Pos;\n" " output.Norm = input[i].Norm;\n" " output.Tex = input[i].Tex;\n" " OutputStream.Append( output );\n" " }\n" " OutputStream.RestartStrip();\n" "}\n" }; geometoryShader = nlCreateGeometoryShader(script, sizeof(script)/sizeof(nlInt8), "main", cxt ); } return; #else const DWORD flag = D3D10_SHADER_ENABLE_STRICTNESS | D3D10_SHADER_PACK_MATRIX_ROW_MAJOR | D3D10_SHADER_OPTIMIZATION_LEVEL3; HRESULT hr = D3D10CompileShader( conbinedScript, nlStrlen(conbinedScript), funcName, shaderMacros, NULL, funcName, "gs_4_0", flag, &pBlob, &pErrorBlob ); if( FAILED(hr) ) { MessageBox( NULL, "failed to load geometory shader", "", MB_OK ); if(pErrorBlob) { MessageBox( NULL, (nlInt8*)pErrorBlob->GetBufferPointer(), "", MB_OK ); } return; } NL_HR_VALID( cxt.d3dDevice->CreateGeometryShader(pBlob->GetBufferPointer(), pBlob->GetBufferSize(), NULL, &geometoryShader.shader ) ); #endif }
/* 全てのシェーダを作成する */ void nlCreateShaders( ShaderType shaderType, int targetIndex, const ShaderScripts& shaderScript, nlEngineContext& cxt ) { /**/ class Local { public: /**/ static void createVS( unsigned int target, const ShaderScripts& ss, nlEngineContext& cxt ) { const ShaderScript& shaderScript = ss.vsScripts.scripts[target]; const nlInt8* script = shaderScript.script; const nlInt8* funcName = "main"; const nlInt8* unitName = shaderScript.name; nlVertexShader& vs = cxt.vss[target]; NL_ASSERT( !vs.shader_ ); /**/ ID3DBlob* pBlob = NULL; ID3DBlob* pErrorBlob = NULL; /* commonと連結 */ const nlInt8* commonScript = ss.commonScripts.script; const nlUint32 scriptLen = nlStrlen( script ) + nlStrlen( commonScript ); nlInt8* conbinedScript = (nlInt8*)nlMalloc( (scriptLen+1)*sizeof(nlInt8) ); nlStrcat( conbinedScript, commonScript ); nlStrcat( conbinedScript, script ); //printf( conbinedScript ); #ifndef INTROMODE const DWORD flag = D3D10_SHADER_ENABLE_STRICTNESS | D3D10_SHADER_PACK_MATRIX_ROW_MAJOR; HRESULT hr = D3D10CompileShader( conbinedScript, nlStrlen(conbinedScript), unitName, shaderMacros, NULL, funcName, "vs_4_0", flag, &pBlob, &pErrorBlob ); /* ロードが失敗したらエラーを出力した後に確実にロードが成功するシェーダをロードする */ if(FAILED( hr ) ) { /**/ NL_ERR( ERR_005, (nlInt8*)pErrorBlob->GetBufferPointer() ); /**/ const nlInt8 script[] = { "cbuffer Const0 : register(b0){ f4x4 world; }" "cbuffer Const2 : register(b2){ f4x4 viewProj; }" "float4 main( float4 in_pos:P, float4 in_normal:N, float4 in_col:C ):SV_POSITION" "{ return mul( in_pos, mul(world,viewProj)); }" }; HRESULT hr = D3D10CompileShader( script, sizeof(script)/sizeof(nlInt8), unitName, shaderMacros, NULL, "main", "vs_4_0", flag, &pBlob, &pErrorBlob ); } #else const DWORD flag = D3D10_SHADER_ENABLE_STRICTNESS | D3D10_SHADER_PACK_MATRIX_ROW_MAJOR | D3D10_SHADER_OPTIMIZATION_LEVEL3; HRESULT hr = D3DX11CompileFromMemory( conbinedScript, nlStrlen(conbinedScript), funcName, shaderMacros, NULL, funcName, "vs_4_0", flag, 0, NULL, &pBlob, &pErrorBlob, NULL ); if(FAILED( hr ) ) { MessageBoxA(NULL,(nlInt8*)pErrorBlob->GetBufferPointer(),"",MB_OK); } #endif /**/ nlFree( (void*)conbinedScript ); /* create shader */ NL_HR_VALID( cxt.d3dDevice->CreateVertexShader(pBlob->GetBufferPointer(), pBlob->GetBufferSize(), NULL, &vs.shader_ ) ); /* create inputlayout */ NL_HR_VALID( cxt.d3dDevice->CreateInputLayout(NLM_INPUT_ELEMENT, _countof(NLM_INPUT_ELEMENT), pBlob->GetBufferPointer(), pBlob->GetBufferSize(), &vs.inputLayout_ ) ); } /* GSの生成 */ static void createGS( nlUint32 target, const ShaderScripts& ss, nlEngineContext& cxt ) { /**/ ID3DBlob* pBlob = NULL; ID3DBlob* pErrorBlob = NULL; nlGeometoryShader& geometoryShader = cxt.gss[target]; const nlInt8* script = ss.gsScripts.scripts[target].script; const nlInt8* funcName = "main"; /**/ NL_ASSERT(!geometoryShader.shader); /* commonと連結 */ const nlInt8* commonScript = ss.commonScripts.script; const nlUint32 scriptLen = nlStrlen( script ) + nlStrlen( commonScript ); nlInt8* conbinedScript = (nlInt8*)nlMalloc( (scriptLen+1)*sizeof(nlInt8) ); nlStrcat( conbinedScript, commonScript ); nlStrcat( conbinedScript, script ); #ifndef INTROMODE const DWORD flag = D3D10_SHADER_ENABLE_STRICTNESS | D3D10_SHADER_PACK_MATRIX_ROW_MAJOR; HRESULT hr = D3D10CompileShader( conbinedScript, nlStrlen(conbinedScript), funcName, shaderMacros, NULL, funcName, "gs_4_0", flag, &pBlob, &pErrorBlob); if( SUCCEEDED(hr) ) { if( SUCCEEDED( cxt.d3dDevice->CreateGeometryShader(pBlob->GetBufferPointer(), pBlob->GetBufferSize(), NULL, &geometoryShader.shader ) ) ) { return ;} else { NL_ASSERT(!"このパスには来ないことになっている"); //goto RELOAD; return ; } } else { /* 失敗した場合はエラーを出力し確実に成功するシェーダをロードする */ const nlInt8* name = ss.gsScripts.scripts[target].name; std::string error = std::string("[")+std::string(name)+std::string("]")+std::string(DXGetErrorDescriptionA(hr)); error.resize(error.size()-1);/* 改行コードを取り除く */ if(pErrorBlob) { error += std::string( (nlInt8*)pErrorBlob->GetBufferPointer() ); error.resize(error.size()-1);/* 改行コードを取り除く */ } NL_ERR( ERR_006, error.c_str()); /**/ const nlInt8 script[] = { "struct GSSceneIn\n" "{\n" " float4 Pos : POS;\n" " float3 Norm : NORMAL;\n" " float2 Tex : TEXCOORD0;\n" "};\n" "struct PSSceneIn\n" "{\n" " float4 Pos : SV_Position;\n" " float3 Norm : TEXCOORD0;\n" " float2 Tex : TEXCOORD1;\n" "};\n" "[maxvertexcount(3)]\n" "void GSScene( triangleadj GSSceneIn input[6], inout TriangleStream<PSSceneIn> OutputStream )\n" "{\n" " PSSceneIn output = (PSSceneIn)0;\n" " for( uint i=0; i<6; i+=2 )\n" " {\n" " output.Pos = input[i].Pos;\n" " output.Norm = input[i].Norm;\n" " output.Tex = input[i].Tex;\n" " OutputStream.Append( output );\n" " }\n" " OutputStream.RestartStrip();\n" "}\n" }; geometoryShader = nlCreateGeometoryShader(script, sizeof(script)/sizeof(nlInt8), "main", cxt ); } return; #else const DWORD flag = D3D10_SHADER_ENABLE_STRICTNESS | D3D10_SHADER_PACK_MATRIX_ROW_MAJOR | D3D10_SHADER_OPTIMIZATION_LEVEL3; HRESULT hr = D3D10CompileShader( conbinedScript, nlStrlen(conbinedScript), funcName, shaderMacros, NULL, funcName, "gs_4_0", flag, &pBlob, &pErrorBlob ); if( FAILED(hr) ) { MessageBox( NULL, "failed to load geometory shader", "", MB_OK ); if(pErrorBlob) { MessageBox( NULL, (nlInt8*)pErrorBlob->GetBufferPointer(), "", MB_OK ); } return; } NL_HR_VALID( cxt.d3dDevice->CreateGeometryShader(pBlob->GetBufferPointer(), pBlob->GetBufferSize(), NULL, &geometoryShader.shader ) ); #endif } /* PSの生成 */ static void createPS( unsigned int target, const ShaderScripts& ss, nlEngineContext& cxt ) { /**/ ID3DBlob* pBlob = NULL; ID3DBlob* pErrorBlob = NULL; nlPixelShader& pixelShader = cxt.pss[target]; const nlInt8* script = ss.psScripts.scripts[target].script; const nlInt8* funcName = "main"; /**/ NL_ASSERT(!pixelShader.shader_); /* commonと連結 */ const nlInt8* commonScript = ss.commonScripts.script; const unsigned int scriptLen = nlStrlen( script ) + nlStrlen( commonScript ); nlInt8* conbinedScript = (nlInt8*)nlMalloc( (scriptLen+1)*sizeof(nlInt8) ); nlStrcat( conbinedScript, commonScript ); nlStrcat( conbinedScript, script ); #ifndef INTROMODE const DWORD flag = D3D10_SHADER_ENABLE_STRICTNESS | D3D10_SHADER_PACK_MATRIX_ROW_MAJOR; HRESULT hr = D3D10CompileShader( conbinedScript, nlStrlen(conbinedScript), funcName, shaderMacros, NULL, funcName, "ps_4_0", flag, &pBlob, &pErrorBlob ); if( SUCCEEDED(hr) ) { if( SUCCEEDED( cxt.d3dDevice->CreatePixelShader(pBlob->GetBufferPointer(), pBlob->GetBufferSize(), NULL, &pixelShader.shader_ ) ) ) { return ;} else { NL_ASSERT(!"このパスには来ないことになっている"); //goto RELOAD; return ; } } else { /* 失敗した場合はエラーを出力し確実に成功するシェーダをロードする */ const nlInt8* name = ss.psScripts.scripts[target].name; std::string error = std::string("[")+std::string(name)+std::string("]")+std::string(DXGetErrorDescriptionA(hr)); error.resize(error.size()-1);/* 改行コードを取り除く */ if(pErrorBlob) { error += std::string( (nlInt8*)pErrorBlob->GetBufferPointer() ); error.resize(error.size()-1);/* 改行コードを取り除く */ } NL_ERR( ERR_006, error.c_str()); /**/ const nlInt8 script[] = { "float4 main():SV_Target0" "{return float4(1,0,0,1);}" }; pixelShader = nlCreatePixelShader(script, sizeof(script)/sizeof(nlInt8), "main", cxt ); } return; #else const DWORD flag = D3D10_SHADER_ENABLE_STRICTNESS | D3D10_SHADER_PACK_MATRIX_ROW_MAJOR | D3D10_SHADER_OPTIMIZATION_LEVEL3; HRESULT hr = D3D10CompileShader( conbinedScript, nlStrlen(conbinedScript), funcName, shaderMacros, NULL, funcName, "ps_4_0", flag, &pBlob, &pErrorBlob ); if( FAILED(hr) ) { MessageBox( NULL, "failed to load pixel shader", "", MB_OK ); if(pErrorBlob) { MessageBox( NULL, (nlInt8*)pErrorBlob->GetBufferPointer(), "", MB_OK ); } return; } NL_HR_VALID( cxt.d3dDevice->CreatePixelShader(pBlob->GetBufferPointer(), pBlob->GetBufferSize(), NULL, &pixelShader.shader_ ) ); #endif } /* 全VSの生成 */ static void LoadAllVS( const ShaderScripts& shaderScripts, nlEngineContext& cxt ) { const ShaderScriptGroup& vsScripts = shaderScripts.vsScripts; const unsigned int numScript = vsScripts.numScript; for( int i=0;i<numScript;++i) { createVS( i, shaderScripts, cxt ); updateLoading(); } } /* 全GSの生成 */ static void LoadAllGS( const ShaderScripts& shaderScripts, nlEngineContext& cxt ) { const ShaderScriptGroup& gsScripts = shaderScripts.gsScripts; const unsigned int numScript = gsScripts.numScript; for( int i=0;i<numScript;++i) { createGS( i, shaderScripts, cxt ); updateLoading(); } } /* 全PSの生成 */ static void LoadAllPS( const ShaderScripts& shaderScripts, nlEngineContext& cxt ) { const ShaderScriptGroup& psScripts = shaderScripts.psScripts; const unsigned int numScript = psScripts.numScript; for( int i=0;i<numScript;++i) { createPS( i, shaderScripts, cxt ); updateLoading(); } } }; /* 全体をロードする場合 */ if( shaderType == ShaderType_NONE ) { /* VS全体をロードする */ Local::LoadAllVS(shaderScript,cxt); /* GS全体をロードする */ Local::LoadAllGS(shaderScript,cxt); /* PS全体をロードする */ Local::LoadAllPS(shaderScript,cxt); /* TODO TS全体をロードする */ /* TODO CS全体をロードする */ } /* 特定の種類のシェーダを読み込む */ else if( targetIndex == -1 ) { switch( shaderType ) { case ShaderType_VS: Local::LoadAllVS(shaderScript,cxt); break; case ShaderType_GS: Local::LoadAllGS(shaderScript,cxt); break; case ShaderType_PS: Local::LoadAllPS(shaderScript,cxt); break; case ShaderType_TS: break; case ShaderType_CS: break; case ShaderType_NONE: default: NL_ASSERT(!"存在しないシェーダタイプ"); break; } } /* ピンポイントでロードする */ else { switch( shaderType ) { case ShaderType_VS: Local::createVS( targetIndex, shaderScript, cxt ); break; case ShaderType_GS: Local::createGS( targetIndex, shaderScript, cxt ); break; case ShaderType_PS: Local::createPS( targetIndex, shaderScript, cxt ); break; case ShaderType_TS: /* TOOD 実装 */ break; case ShaderType_CS: /* TOOD 実装 */ break; case ShaderType_NONE: /* TOOD 実装 */ default: NL_ASSERT(!"存在しないシェーダタイプ"); break; } } }
void ntGenerateTextures(const ShaderScripts& shaderScript, nlEngineContext* cxt ) { #if 0 /* この関数が呼ばれる前にテクスチャは解放されている事が期待される */ for( int i=0;i<MAX_TEXTURE_NUM;++i){ NL_ASSERT( !cxt->texs[i].texture );} const ShaderScriptGroup& tsScripts = shaderScript.tsScripts; const ShaderScript& commonScrips = shaderScript.commonScripts; /**/ NL_ASSERT( 0 < tsScripts.numScript ); /**/ ID3D11Device* d3dDevice = cxt->d3dDevice; ID3D11DeviceContext* d3dContext = cxt->d3dContext; tsScripts.numScript; tsScripts.scripts[0].script; tsScripts.scripts[0].name; //const nlInt8* script = tsScripts.scripts; nlTexture* texuters = &(cxt->texs[0]); /**/ const unsigned int scriptLen = nlStrlen(script); /* 全シェーダを作成 */ ID3D11PixelShader* texturShaders[MAX_TEXTURE_NUM]; nlMemset( texturShaders, 0, sizeof(ID3D11PixelShader*)*MAX_TEXTURE_NUM ); /**/ const unsigned int numTexture = textureScripts.numTexture; /**/ for( unsigned int i=0;i<numTexture;++i) { ID3DBlob* pBlob = NULL; ID3DBlob* pErrorBlob = NULL; const nlInt8* funcName = textureScripts.funcs[i]; const DWORD flag = D3D10_SHADER_ENABLE_STRICTNESS | D3D10_SHADER_PACK_MATRIX_ROW_MAJOR; /* ピクセルシェーダの作成 */ if( FAILED( D3D10CompileShader( script, scriptLen, funcName, shaderMacros, NULL, "main", "ps_4_0",flag, &pBlob, &pErrorBlob ) ) ) { NL_ERR(ERR_009); MessageBoxA( NULL, "load texshader error", "", MB_OK ); if(pErrorBlob) { NL_ERR(ERR_003, pErrorBlob->GetBufferPointer() ); MessageBoxA( NULL, (nlInt8*)pErrorBlob->GetBufferPointer(), "", MB_OK ); } return; } if( pBlob ) { d3dDevice->CreatePixelShader(pBlob->GetBufferPointer(), pBlob->GetBufferSize(), NULL, &texturShaders[i] ); } ++i; } /* 書きこむのに必要なシェーダを作成 */ ID3D11VertexShader* vsRenderQuad; ID3DBlob* pBlob = NULL; ID3DBlob* pErrorBlob = NULL; NL_HR_ASSSERT( D3D10CompileShader(script, scriptLen, "vs", shaderMacros, NULL, "main","vs_4_0",(D3D10_SHADER_ENABLE_STRICTNESS | D3D10_SHADER_PACK_MATRIX_ROW_MAJOR), &pBlob, &pErrorBlob ) ) ; d3dDevice->CreateVertexShader( pBlob->GetBufferPointer(), pBlob->GetBufferSize(), NULL, &vsRenderQuad ); /* 全テクスチャを作成 */ for(unsigned int i=0;i<numTexture;++i) { /**/ nlTexture& tex = texuters[i]; /**/ tex.width = 512; /* HACK サイズは適当 */ tex.height = 512; /* HACK サイズは適当 */ int mipLevel = 1; int CPUAccessFlags = 0; D3D11_TEXTURE2D_DESC descTarget = { tex.width, tex.height, mipLevel, 1, DXGI_FORMAT_B8G8R8A8_UNORM, {1,0}, D3D11_USAGE_DEFAULT, (D3D11_BIND_RENDER_TARGET | D3D10_BIND_SHADER_RESOURCE), CPUAccessFlags, 0 }; d3dDevice->CreateTexture2D( &descTarget, NULL, &tex.texture ); d3dDevice->CreateRenderTargetView( tex.texture, NULL, &tex.rtView ); d3dDevice->CreateShaderResourceView( tex.texture, NULL ,&tex.shaderView ); } /* 現在のRasterStateを取得 */ ID3D11RasterizerState* oldRasterState; d3dContext->RSGetState(&oldRasterState); /**/ D3D11_RASTERIZER_DESC rasterDesc; rasterDesc.AntialiasedLineEnable = false; rasterDesc.CullMode = D3D11_CULL_NONE; rasterDesc.DepthBias = 0; rasterDesc.DepthBiasClamp = 0.0f; rasterDesc.DepthClipEnable = true; rasterDesc.FillMode = D3D11_FILL_SOLID; rasterDesc.FrontCounterClockwise = false; rasterDesc.MultisampleEnable = false; rasterDesc.ScissorEnable = false; rasterDesc.SlopeScaledDepthBias = 0.0f; ID3D11RasterizerState* rasterState; d3dDevice->CreateRasterizerState(&rasterDesc, &rasterState); d3dContext->RSSetState(rasterState); rasterState->Release(); /* 全テクスチャを焼き込む */ for(unsigned int i=0;i<numTexture;++i) { /**/ nlTexture& tex = texuters[i]; /* ビューポートの設定 */ D3D11_VIEWPORT viewport; viewport.Width = tex.width; viewport.Height = tex.height; viewport.MinDepth = 0.0f; viewport.MaxDepth = 1.0f; viewport.TopLeftX = 0.0f; viewport.TopLeftY = 0.0f; d3dContext->RSSetViewports(1, &viewport); /* シェーダを設定する */ d3dContext->VSSetShader( vsRenderQuad, NULL, 0); d3dContext->PSSetShader( texturShaders[i], NULL, 0); /* レンダーターゲットを設定する */ const float clearColor[4] = {0.0f, 0.0f, 1.0f, 0.0f}; d3dContext->ClearRenderTargetView( tex.rtView, clearColor ); d3dContext->OMSetRenderTargets( 1, &tex.rtView, NULL ); /* 全てのテクスチャを設定する */ /* TODO 毎回全てのテクスチャを設定せずに、このループで設定したテクスチャを省くようにだけする?*/ for( unsigned int j=0;j<numTexture;++j) { if( i != j ) { nlTexture& texSamp = texuters[j]; d3dContext->PSSetShaderResources(j, 1, &texSamp.shaderView ); } } /* 描画する */ d3dContext->IASetPrimitiveTopology( D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP ); d3dContext->Draw( 4, 0 ); } /**/ d3dContext->VSSetShader( NULL, NULL, 0); d3dContext->PSSetShader( NULL, NULL, 0); /* ビューポート設定を元に戻す */ /* 現在のビューポート設定を取得しておく */ D3D11_VIEWPORT oldViewports = {0.0,0.0,cxt->rendertargets[0].width_,cxt->rendertargets[0].height_,0.0f,1.0f}; d3dContext->RSSetViewports( 1, &oldViewports ); /* RasterState設定を元に戻す */ d3dContext->RSSetState(oldRasterState); if( oldRasterState ){ oldRasterState->Release(); } /* PSを解放 */ for(unsigned int i=0;i<numTexture;++i) { if( texturShaders[i] ){ texturShaders[i]->Release(); } } #endif }