bool CDx9FragmentProgram::load(const char* buf,size_t fsize) { if (m_isLoad) release(); LPD3DXBUFFER errors; LPD3DXBUFFER pBuffer; HRESULT hr; hr = D3DXPreprocessShader( buf, static_cast<uint>(fsize), ((DX9_ShaderMacroMgr*)ShaderMacroMgr::GetInst())->GET_MACRO(m_ID), DX9_ShaderInclude::GetInst(), &pBuffer, &errors); if (FAILED(hr)) { string message = "D3D9 Pixel Shader拼接不成功 Errors:\n"; message.append(static_cast<const char*>(errors->GetBufferPointer())); errors->Release(); OutputDebugString(message.c_str()); GenErr(GraphicErr::GetErrTypeStr(ShaderInit_Err),message); return false; } m_cCode = static_cast<const char*>(pBuffer->GetBufferPointer()); SafeRelease(pBuffer); return true; }
/** Preprocesses a shader without performing compilation, and dump it out for debugging*/ void D3D9PreProcessShader( const TCHAR* strFilename, const FString& strShaderFile, vector<D3DXMACRO>& Defines, const FD3DIncludeEnvironment& Environment, const TCHAR* strShaderPath ) { TRefCountPtr<ID3DXBuffer> ShaderCode; TRefCountPtr<ID3DXBuffer> ErrorText; FTCHARToANSI AnsiShaderFile(strShaderFile.c_str()); FD3DIncludeEnvironment IncludeEnvironment(Environment); HRESULT ret = D3DXPreprocessShader( (ANSICHAR*)AnsiShaderFile, strShaderFile.size(), &Defines.at(0), &IncludeEnvironment, ShaderCode.GetInitReference(), ErrorText.GetInitReference() ); if( FAILED(ret) ) { debugf(NAME_Warning, TEXT("Preprocess failed for shader %s: %s"), strFilename, ANSI_TO_TCHAR(ErrorText->GetBufferPointer())); } else { TCHAR Tmp[MAX_SPRINTF]; appSprintf(Tmp, TEXT("%s%s.pre"), strShaderPath, strFilename); appSaveStringToFile(ANSI_TO_TCHAR(ShaderCode->GetBufferPointer()), Tmp); } }