示例#1
0
void PhongMaterial::prepareLocalChunks(void)
{
    if(_materialChunk != NullFC)
        return;

    _materialChunk = MaterialChunk::create();
    addRefCP(_materialChunk);

    _blendChunk = BlendChunk::create();
    addRefCP(_blendChunk);
    beginEditCP(_blendChunk);
    _blendChunk->setSrcFactor (GL_SRC_ALPHA);
    _blendChunk->setDestFactor(GL_ONE_MINUS_SRC_ALPHA);
    endEditCP  (_blendChunk);

    // phong shading without a fragment shader looks quite black ;-)
    // all cards with a fragment shader should also have a vertex shader.
    // calling hasCommonExtension() here is not a good idea as this works
    // only for a initialized window, I added a check to hasCommonExtension()
    // so this won't crash anymore.
    if(Window::hasCommonExtension(_arbFragmentProgram))
    {
        _vpChunk = VertexProgramChunk::create();
        addRefCP(_vpChunk);
        beginEditCP(_vpChunk);
        _vpChunk->setProgram(_phong_vp_prg);
        endEditCP(_vpChunk);

        _fpChunk = FragmentProgramChunk::create();
        addRefCP(_fpChunk);
        createFragmentProgram();
    }
}
示例#2
0
void RenderMethod_Grass_CG::setupShader(CGcontext &cg,
                                        CGprofile &_cgVertexProfile,
                                        CGprofile &_cgFragmentProfile) {
	RenderMethod::setupShader(cg, _cgVertexProfile, _cgFragmentProfile);
	
	createVertexProgram(cg, FileName("data/shaders/cg/grass.vp.cg"));
	createFragmentProgram(cg, FileName("data/shaders/cg/grass.fp.cg"));
	
	// Vertex program parameters
	cgMVP             = getVertexProgramParameter  (cg, "MVP");
	cgView            = getVertexProgramParameter  (cg, "View");
	cgViewI           = getVertexProgramParameter  (cg, "ViewI");
	cgLightPos        = getVertexProgramParameter  (cg, "LightPos");
	cgCameraPos       = getVertexProgramParameter  (cg, "CameraPos");
	cgCameraRight     = getVertexProgramParameter  (cg, "CameraRight");
	cgCameraUp        = getVertexProgramParameter  (cg, "CameraUp");
	cgTime            = getVertexProgramParameter  (cg, "time");
	
	// Fragment program parameters
	cgTexture         = getFragmentProgramParameter(cg, "tex0");
	cgKa              = getFragmentProgramParameter(cg, "Ka");
	cgKd              = getFragmentProgramParameter(cg, "Kd");
	cgkC              = getFragmentProgramParameter(cg, "kC");
	cgkL              = getFragmentProgramParameter(cg, "kL");
	cgkQ              = getFragmentProgramParameter(cg, "kQ");
}
示例#3
0
StatePtr PhongMaterial::makeState(void)
{
    StatePtr state = State::create();

    prepareLocalChunks();

    Color3f v3;
    Color4f v4;
    float alpha = 1.f - getTransparency();

    prepareLocalChunks();

    beginEditCP(_materialChunk);
    v3 = getAmbient();
    v4.setValuesRGBA(v3[0], v3[1], v3[2], alpha);
    _materialChunk->setAmbient(v4);

    v3 = getDiffuse();
    v4.setValuesRGBA(v3[0], v3[1], v3[2], alpha);
    _materialChunk->setDiffuse(v4);

    v3 = getSpecular();
    v4.setValuesRGBA(v3[0], v3[1], v3[2], alpha);
    _materialChunk->setSpecular(v4);

    _materialChunk->setShininess(getShininess());

    v3 = getEmission();
    v4.setValuesRGBA(v3[0], v3[1], v3[2], alpha);
    _materialChunk->setEmission(v4);

    _materialChunk->setLit(getLit());
    _materialChunk->setColorMaterial(getColorMaterial());
    endEditCP  (_materialChunk);
    state->addChunk(_materialChunk);

    if(isTransparent())
        state->addChunk(_blendChunk);

    if(_vpChunk != NullFC)
        state->addChunk(_vpChunk);

    createFragmentProgram();

    if(_fpChunk != NullFC)
        state->addChunk(_fpChunk);

    for(MFStateChunkPtr::iterator i  = _mfChunks.begin();
            i != _mfChunks.end();
            ++i)
    {
        state->addChunk(*i);
    }

    return state;
}
示例#4
0
void RenderMethod_CGTest::setupShader(CGcontext &cg,
                                      CGprofile &_cgVertexProfile,
                                      CGprofile &_cgFragmentProfile) {
	RenderMethod::setupShader(cg, _cgVertexProfile, _cgFragmentProfile);
	
	createVertexProgram(cg, FileName("data/shaders/cg/test.vp.cg"));
	createFragmentProgram(cg, FileName("data/shaders/cg/test.fp.cg"));
	
	// get handles shader program parameters
	cgProj    = getVertexProgramParameter  (cg, "Proj");
	cgView    = getVertexProgramParameter  (cg, "View");
	cgTexture = getFragmentProgramParameter(cg, "tex0");
	
	// setup shader constants
	cgGLSetStateMatrixParameter(cgProj, CG_GL_PROJECTION_MATRIX, CG_GL_MATRIX_IDENTITY);
	cgSetParameterVariability(cgProj, CG_LITERAL); // make it a constant
}
示例#5
0
void RenderMethod_TerrainPhong_CG::setupShader(CGcontext &cg,
  CGprofile &_cgVertexProfile,
  CGprofile &_cgFragmentProfile) {
	RenderMethod::setupShader(cg, _cgVertexProfile, _cgFragmentProfile);
	
	createVertexProgram(cg, FileName("data/shaders/cg/terrain.vp.cg"));
	createFragmentProgram(cg, FileName("data/shaders/cg/terrain.fp.cg"));
	
	// Vertex program parameters
	cgMVP             = getVertexProgramParameter  (cg, "MVP");
	cgView            = getVertexProgramParameter  (cg, "View");
	cgCameraPos       = getVertexProgramParameter  (cg, "CameraPos");
	cgLightDir        = getFragmentProgramParameter(cg, "LightDir");
	cgTexture         = getFragmentProgramParameter(cg, "tex0");
	cgKa              = getFragmentProgramParameter(cg, "Ka");
	cgKd              = getFragmentProgramParameter(cg, "Kd");
}
	//---------------------------------------------------------------------
	HighLevelGpuProgramPtr 
	TerrainMaterialGeneratorC::SM2Profile::ShaderHelper::generateFragmentProgram(
		const SM2Profile* prof, const Terrain* terrain, TechniqueType tt)
	{
		HighLevelGpuProgramPtr ret = createFragmentProgram(prof, terrain, tt);
 
		StringUtil::StrStreamType sourceStr;
		generateFragmentProgramSource(prof, terrain, tt, sourceStr);
		ret->setSource(sourceStr.str());
		ret->load();
		defaultFpParams(prof, terrain, tt, ret);
 
#if 1
		LogManager::getSingleton().stream(LML_TRIVIAL) << "*** Terrain Fragment Program: " 
			<< ret->getName() << " ***\n" << ret->getSource() << "\n***   ***";
#endif
 
		return ret;
	}
示例#7
0
void RenderMethod_PhongPoint_CG::setupShader(CGcontext &cg,
  CGprofile &_cgVertexProfile,
  CGprofile &_cgFragmentProfile) {
	RenderMethod::setupShader(cg, _cgVertexProfile, _cgFragmentProfile);
	
	createVertexProgram(cg, FileName("data/shaders/cg/phong_point.vp.cg"));
	createFragmentProgram(cg, FileName("data/shaders/cg/phong_point.fp.cg"));
	
	// Vertex program parameters
	cgMVP             = getVertexProgramParameter  (cg, "MVP");
	cgView            = getVertexProgramParameter  (cg, "View");
	cgLightPos        = getVertexProgramParameter  (cg, "LightPos");
	cgCameraPos       = getVertexProgramParameter  (cg, "CameraPos");
	cgTexture         = getFragmentProgramParameter(cg, "tex0");
	cgKa              = getFragmentProgramParameter(cg, "Ka");
	cgKd              = getFragmentProgramParameter(cg, "Kd");
	cgKs              = getFragmentProgramParameter(cg, "Ks");
	cgShininess       = getFragmentProgramParameter(cg, "shininess");
	cgkC              = getFragmentProgramParameter(cg, "kC");
	cgkL              = getFragmentProgramParameter(cg, "kL");
	cgkQ              = getFragmentProgramParameter(cg, "kQ");
}