/*------------------------------------------------------------------------- -------------------------------------------------------------------------*/ bool FilterBox::Initialize(int w, int h) { bufw = w; bufh = h; // // FBO // glGenFramebuffersEXT(2, fb); glGenTextures(2, textureID); glGenRenderbuffersEXT(1, &depth_rb); initRT(0, w, h); initRT(1, w, h); // // initialize depth renderbuffer // glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, depth_rb); glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT24, w, h); glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, depth_rb); CheckFramebufferStatus(); glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); // // CGFX things // cgContext = cgCreateContext(); cgGLRegisterStates(cgContext); std::string resolved_path; cgEffect = cgCreateEffectFromFile(cgContext, "data/shaders/FilterBox.cgfx", NULL); if(!cgEffect) { exit(0); const char * pszErrors = NULL; fprintf(stderr, "CgFx Parse error : %s", pszErrors); const char *listing = cgGetLastListing(cgContext); bValid = false; return false; } cgTechnique = cgGetNamedTechnique(cgEffect, "Filter"); cgPassFilterH = cgGetNamedPass(cgTechnique, "verticalPass"); cgPassFilterV = cgGetNamedPass(cgTechnique, "horizontalPass"); cgPassBlend = cgGetNamedPass(cgTechnique, "drawFinal"); cgBlendFactor = cgGetNamedEffectParameter(cgEffect, "blendFactor"); cgGlowFactor = cgGetNamedEffectParameter(cgEffect, "glowFactor"); srcSampler = cgGetNamedEffectParameter(cgEffect, "srcSampler"); tempSampler = cgGetNamedEffectParameter(cgEffect, "tempSampler"); finalSampler = cgGetNamedEffectParameter(cgEffect, "finalSampler"); verticalDir = cgGetNamedEffectParameter(cgEffect, "verticalDir"); horizontalDir = cgGetNamedEffectParameter(cgEffect, "horizontalDir"); cgGLSetParameter2f(verticalDir, 0,1.0f/(float)h); cgGLSetParameter2f(horizontalDir, 1.0f/(float)w, 0); bValid = true; return true; }
bool CGFXShader::LoadFromFile(const char* szFile) { HRESULT hr = S_OK; char buffer[128]; m_pEffect = cgCreateEffectFromFile( m_pCG, szFile, NULL ); CGerror error; const char *string = cgGetLastErrorString(&error); static char szError[1024]; if( error != CG_NO_ERROR ) { if( error == CG_COMPILER_ERROR ) { sprintf(szError, "Program: %s\n" "Error: %s\n\n" "Cg compiler output...\n%s", szFile, string, cgGetLastListing(m_pCG)); } else { sprintf(szError, "Program: %s\n" "Error: %s", szFile, string); } OutputDebugStringA(szError); OutputDebugStringA("\n"); } if(m_pEffect == NULL) { return false; } CGtechnique pTechnique = cgGetFirstTechnique( m_pEffect ); while( pTechnique && cgValidateTechnique( pTechnique ) == CG_FALSE ) { pTechnique = cgGetNextTechnique( pTechnique ); } if( pTechnique == NULL) { return false; } m_pTechnique = pTechnique; return true; }
bool cEffect::Init(const std::string &lacNameId, const std::string &lacFile) { //Initialization of the class atributes macFile = lacFile; macLastTechnique = ""; mEffect = NULL; mTechnique = NULL; mCurrentPass = NULL; mbLoaded = false; //Loading of the effect CGcontext lCGContext = cEffectManager::Get().GetCGContext(); mEffect = cgCreateEffectFromFile(lCGContext, lacFile.c_str(), NULL); if (!mEffect) { OutputDebugString("Unable to create effect\n"); const char *lacListing = cgGetLastListing(lCGContext); if (lacListing) { char lacBuffer[512]; sprintf(lacBuffer, "%s\n", lacListing); OutputDebugString(lacBuffer); } return false; } // Check if the techniques are valid CGtechnique lTechnique = cgGetFirstTechnique(mEffect); while (lTechnique) { if (cgValidateTechnique(lTechnique) == CG_FALSE) { char lacBuffer[512]; sprintf(lacBuffer, "Technique %s did not validate. Skipping. \n", cgGetTechniqueName(lTechnique)); OutputDebugString( lacBuffer ); const char *lacListing = cgGetLastListing(lCGContext); if (lacListing) { char lacBuffer[512]; sprintf(lacBuffer, "%s\n", lacListing); OutputDebugString(lacBuffer); } } lTechnique = cgGetNextTechnique(lTechnique); } mbLoaded = true; return true; }
CgEffect::CgEffect(CGcontext context, const char* filename, bool fromFile) : effect(NULL), context(context), activeTechnique(NULL), currentPass(NULL), nextPass(NULL) { effect = cgCreateEffectFromFile(context, filename, NULL); CGerror error; const char* errorStr = cgGetLastErrorString(&error); if(error) throw new GeexShaderException("CG Effect creation failed", errorStr); }
BOOL CPostEffectConverter::Begin(LPCSTR lpszShaderFile) { // Cgコンテキスト作成 m_pCgContext = cgCreateContext(); // stateの保持のために必要 // ただし、D3D9関係のヘッダ、ライブラリ、DLLが必要になる cgD3D9RegisterStates(m_pCgContext); // エフェクト作成 m_pCgEffect = cgCreateEffectFromFile( m_pCgContext, lpszShaderFile, NULL); CGerror error = ::cgGetError(); if (error != CG_NO_ERROR) { // TODO // エラー出力表示 const char* pErrorStr = cgGetLastListing(m_pCgContext); if (pErrorStr != NULL) { printf("%s\n", pErrorStr); #if 0 // NOTE // 何故かcgCreateEffectFromFileでコンパイルが失敗してもNULLが返ってこないことがある・・・。 // なので、エラー文字列を調べて "error" があったら失敗とみなす・・・。 izanagi::tool::CString str(pErrorStr); if (str.Find(_T(" error ")) >= 0) { return FALSE; } #endif } } if (m_pCgEffect == NULL) { // エフェクト作成失敗したので、コンバート失敗 return FALSE; } return TRUE; }
// // An effect // cgfxEffect::cgfxEffect(const MString& fileName, const cgfxProfile* profile) : refcount(0), fEffect(NULL), fTechniques(NULL), fProfile(NULL) { MStringArray fileOptions; cgfxGetFxIncludePath( fileName, fileOptions ); fileOptions.append("-DMAYA_CGFX=1"); if (cgfxProfile::getTexCoordOrientation() == cgfxProfile::TEXCOORD_OPENGL) { fileOptions.append("-DMAYA_TEXCOORD_ORIENTATION_OPENGL=1"); } else { fileOptions.append("-DMAYA_TEXCOORD_ORIENTATION_DIRECTX=1"); } const char *opts[_CGFX_PLUGIN_MAX_COMPILER_ARGS_]; unsigned int numOpts = fileOptions.length(); if (numOpts) { numOpts = (numOpts > _CGFX_PLUGIN_MAX_COMPILER_ARGS_-1) ? _CGFX_PLUGIN_MAX_COMPILER_ARGS_-1 : numOpts; for (unsigned int i=0; i<numOpts; i++) opts[i] = fileOptions[i].asChar(); opts[numOpts] = NULL; } fEffect = cgCreateEffectFromFile(cgfxShaderNode::sCgContext, fileName.asChar(), opts); if (fEffect) { CGtechnique technique = cgGetFirstTechnique(fEffect); cgfxTechnique** nextTechnique = const_cast<cgfxTechnique**>(&fTechniques); while (technique) { *nextTechnique = new cgfxTechnique(technique, profile); nextTechnique = &(*nextTechnique)->fNext; technique = cgGetNextTechnique(technique); } fProfile = profile; } }
Effect::Effect( const char *_filename ) { effect = cgCreateEffectFromFile( context, _filename, NULL ); techniques = cgGetFirstTechnique(effect); }
cCgShaderHelper::cCgShaderHelper(const zsString& shaderPath) { cFileUtil::ReplaceIncludeDirectives(shaderPath, cgFileLines, includedFilesPaths); // Setup context, for creation (Yeah silly, but use OpenGL cg state and params) because equal with dx... CGcontext con = cgCreateContext(); cgGLRegisterStates(con); cgGLSetManageTextureParameters(con, CG_TRUE); // Create cg effect from file (load) assert(shaderPath.size() <= 256); char ansiShaderPath[256]; cStrUtil::ToAnsi(shaderPath, ansiShaderPath, 256); CGeffect effect = cgCreateEffectFromFile(con, ansiShaderPath, nullptr); if (effect == nullptr) { lastErrorMsg = cgGetLastListing(con); // Free up cgDestroyEffect(effect); cgDestroyContext(con); return; } // Tech creation CGtechnique tech = cgGetFirstTechnique(effect); if (tech == nullptr) { lastErrorMsg = L"There is no Technique in shader: " + shaderPath; // Free up cgDestroyEffect(effect); cgDestroyContext(con); return; } // Pass creation CGpass pass = cgGetFirstPass(tech); if (pass == nullptr) { lastErrorMsg = L"There is no pass in shader: " + shaderPath; // Free up cgDestroyEffect(effect); cgDestroyContext(con); return; } CGprogram shaderPrograms[NDOMAINS]; shaderPrograms[VS] = cgGetPassProgram(pass, CGdomain::CG_VERTEX_DOMAIN); shaderPrograms[HS] = cgGetPassProgram(pass, CGdomain::CG_TESSELLATION_CONTROL_DOMAIN); shaderPrograms[DS] = cgGetPassProgram(pass, CGdomain::CG_TESSELLATION_EVALUATION_DOMAIN); shaderPrograms[GS] = cgGetPassProgram(pass, CGdomain::CG_GEOMETRY_DOMAIN); shaderPrograms[PS] = cgGetPassProgram(pass, CGdomain::CG_FRAGMENT_DOMAIN); // Domain infos for (uint8_t i = 0; i < NDOMAINS; i++) { // Domain existence info.domainsExist[i] = shaderPrograms[i] != nullptr; // if exist save entry name if (info.domainsExist[i]) info.domainsEntry[i] = cgGetProgramString(shaderPrograms[i], CGenum::CG_PROGRAM_ENTRY); } // Free up cgDestroyEffect(effect); cgDestroyContext(con); }