コード例 #1
0
	//---------------------------------------------------------------------
	MaterialPtr TerrainMaterialGeneratorA::SM2Profile::generate(const Terrain* terrain)
	{
		// re-use old material if exists
		MaterialPtr mat = terrain->_getMaterial();
		if (mat.isNull())
		{
			MaterialManager& matMgr = MaterialManager::getSingleton();

			// it's important that the names are deterministic for a given terrain, so
			// use the terrain pointer as an ID
			const String& matName = terrain->getMaterialName();
			mat = matMgr.getByName(matName);
			if (mat.isNull())
			{
				mat = matMgr.create(matName, ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME);
			}
		}
		// clear everything
		mat->removeAllTechniques();
		
		// Automatically disable normal & parallax mapping if card cannot handle it
		// We do this rather than having a specific technique for it since it's simpler
		GpuProgramManager& gmgr = GpuProgramManager::getSingleton();
		if (!gmgr.isSyntaxSupported("ps_4_0") && !gmgr.isSyntaxSupported("ps_3_0") && !gmgr.isSyntaxSupported("ps_2_x")
			&& !gmgr.isSyntaxSupported("fp40") && !gmgr.isSyntaxSupported("arbfp1") && !gmgr.isSyntaxSupported("glsl")
            && !gmgr.isSyntaxSupported("glsles"))
		{
			setLayerNormalMappingEnabled(false);
			setLayerParallaxMappingEnabled(false);
		}

		addTechnique(mat, terrain, HIGH_LOD);

		// LOD
		if(mCompositeMapEnabled)
		{
			addTechnique(mat, terrain, LOW_LOD);
			Material::LodValueList lodValues;
			lodValues.push_back(TerrainGlobalOptions::getSingleton().getCompositeMapDistance());
			mat->setLodLevels(lodValues);
			Technique* lowLodTechnique = mat->getTechnique(1);
			lowLodTechnique->setLodIndex(1);
		}

		updateParams(mat, terrain);

		return mat;

	}
コード例 #2
0
	//---------------------------------------------------------------------
	MaterialPtr TerrainMaterialGeneratorC::SM2Profile::generateForCompositeMap(const Terrain* terrain)
	{
		// re-use old material if exists
		MaterialPtr mat = terrain->_getCompositeMapMaterial();
		if (mat.isNull())
		{
			MaterialManager& matMgr = MaterialManager::getSingleton();
 
			// it's important that the names are deterministic for a given terrain, so
			// use the terrain pointer as an ID
			const String& matName = terrain->getMaterialName() + "/comp";
			mat = matMgr.getByName(matName);
			if (mat.isNull())
			{
				mat = matMgr.create(matName, ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME);
			}
		}
		// clear everything
		mat->removeAllTechniques();
 
		addTechnique(mat, terrain, RENDER_COMPOSITE_MAP);
 
		updateParamsForCompositeMap(mat, terrain);
 
		return mat;
 
	}
コード例 #3
0
veMaterial* veDeferredRenderPipeline::createIBLightMaterial(veLight *light)
{
    auto material = new veMaterial;
    auto technique = new veTechnique;
    auto pass = new vePass;
    material->addTechnique(technique);
    technique->addPass(pass);
    
    initLightCommomParams(light, pass);
    pass->setRenderPass(vePass::FORWARD_PASS);
    pass->depthTest() = false;
    pass->depthWrite() = false;
    pass->stencilTest() = false;
    pass->cullFace() = true;
    pass->cullFaceMode() = GL_BACK;
    pass->blendFunc().src = GL_ONE;
    pass->blendFunc().dst = GL_ONE;
    pass->blendEquation() = GL_FUNC_ADD;
    pass->setShader(new veShader(veShader::VERTEX_SHADER, SCREEN_BASED_LIGHT_VERTEX_SHADER));
    pass->setShader(new veShader(veShader::FRAGMENT_SHADER, IB_LIGHT_FRAGMENT_SHADER));
    pass->addUniform(new veUniform("u_lightDirection", veVec3::ZERO));
    pass->addUniform(new veUniform("u_specularMipMapCount", 1.0f));
    pass->addUniform(new veUniform("u_diffuseLighting", 4));
    pass->addUniform(new veUniform("u_specularLighting", 5));
    
    
    return material;
}
コード例 #4
0
veMaterial* veDeferredRenderPipeline::createDirectionalLightMaterial(veLight *light)
{
    auto material = new veMaterial;
    auto technique = new veTechnique;
    auto pass = new vePass;
    material->addTechnique(technique);
    technique->addPass(pass);
    
    initLightCommomParams(light, pass);
    pass->setRenderPass(vePass::FORWARD_PASS);
    pass->depthTest() = false;
    pass->depthWrite() = false;
    pass->stencilTest() = false;
    pass->cullFace() = true;
    pass->cullFaceMode() = GL_BACK;
    pass->blendFunc().src = GL_ONE;
    pass->blendFunc().dst = GL_ONE;
    pass->blendEquation() = GL_FUNC_ADD;
    pass->setShader(new veShader(veShader::VERTEX_SHADER, SCREEN_BASED_LIGHT_VERTEX_SHADER));
    pass->setShader(new veShader(veShader::FRAGMENT_SHADER, DIRECTIONAL_LIGHT_FRAGMENT_SHADER));
    pass->addUniform(new veUniform("u_lightDirection", veVec3::ZERO));
    pass->addUniform(new veUniform("u_lightMatrixs", &veMat4::IDENTITY, 1));
    pass->addUniform(new veUniform("u_shadowCascadedLevels", 0.f));
    pass->addUniform(new veUniform("u_shadowCascadedCount", 0.f));
    pass->addUniform(new veUniform("u_shadowTex", 4));
    
    return material;
}
コード例 #5
0
ファイル: material.cpp プロジェクト: HedgehogGrandpa/openmw
    bool Effect::define_techniques()
    {
        try
        {
            if (mUseShaders && mShaderManager)
                addTechnique(new ShaderTechnique(*mShaderManager, mForcePerPixelLighting, mClampLighting, mLayers, mBlendmaps, mBlendmapScale, mLayerTileSize));
            else
                addTechnique(new FixedFunctionTechnique(mLayers, mBlendmaps, mBlendmapScale, mLayerTileSize));
        }
        catch (std::exception& e)
        {
            std::cerr << "Error: " << e.what() << std::endl;
            addTechnique(new FixedFunctionTechnique(mLayers, mBlendmaps, mBlendmapScale, mLayerTileSize));
        }

        return true;
    }
コード例 #6
0
	//-----------------------------------------------------------------------
	ParticleSystem& ParticleSystem::operator=(const ParticleSystem& ps)
	{
		// Destroy all existing techniques.
		destroyAllTechniques();

		// Copy techniques
		size_t i = 0;
		ParticleTechnique* psTechnique = 0;
		ParticleTechnique* clonedTechnique = 0;
		for(i = 0; i < ps.getNumTechniques(); ++i)
		{
			psTechnique = ps.getTechnique(i);
			clonedTechnique = ParticleSystemManager::getSingletonPtr()->cloneTechnique(psTechnique);
			addTechnique(clonedTechnique);
		}

		// Copy attributes
		mNonvisibleUpdateTimeout = ps.mNonvisibleUpdateTimeout;
		mNonvisibleUpdateTimeoutSet = ps.mNonvisibleUpdateTimeoutSet;
		mResourceGroupName = ps.mResourceGroupName;
		mLodDistanceList = ps.mLodDistanceList;
		mSmoothLod  = ps.mSmoothLod;
		mIterationIntervalSet = ps.mIterationIntervalSet;
		mIterationInterval = ps.mIterationInterval;
		mTimeSinceLastUpdate = ps.mTimeSinceLastUpdate;
		mFixedTimeout = ps.mFixedTimeout;
		mFixedTimeoutSet = ps.mFixedTimeoutSet;
		mState = ps.mState;
		mTimeElapsedSinceStart = ps.mTimeElapsedSinceStart;
		mSuppressNotifyEmissionChange = ps.mSuppressNotifyEmissionChange;
		mFastForwardSet = ps.mFastForwardSet;
		mOriginalFastForwardSet = ps.mOriginalFastForwardSet;
		mFastForwardTime = ps.mFastForwardTime;
		mFastForwardInterval = ps.mFastForwardInterval;
		mMainCameraName = ps.mMainCameraName;
		mMainCameraNameSet = ps.mMainCameraNameSet;
		mParticleSystemScale = ps.mParticleSystemScale;
		mParticleSystemScaleVelocity = ps.mParticleSystemScaleVelocity;
		mParticleSystemScaleTime = ps.mParticleSystemScaleTime;
		mKeepLocal = ps.mKeepLocal;
		mTightBoundingBox = ps.mTightBoundingBox;
		mPauseTime = ps.mPauseTime;
		mPauseTimeSet = ps.mPauseTimeSet;
		mPauseTimeElapsed = ps.mPauseTimeElapsed;
		mTemplateName = ps.mTemplateName;
		mSceneManager = ps.mSceneManager;
		mStopFadeSet = ps.mStopFadeSet;
		mCategory = ps.mCategory;

		// Notify.
		mSuppressNotifyEmissionChange = false;
		_notifyEmissionChange();
		_notifyRescaled();
		_notifyVelocityRescaled();

		return *this;
    }
コード例 #7
0
ファイル: sceneeffect.cpp プロジェクト: 2gis/2gisqt5android
SceneEffect::SceneEffect(Qt3DCore::QNode *parent)
    : Qt3DRender::QEffect(parent)
    , m_gl3Technique(new Qt3DRender::QTechnique())
    , m_gl2Technique(new Qt3DRender::QTechnique())
    , m_gl2Pass(new Qt3DRender::QRenderPass())
    , m_gl3Pass(new Qt3DRender::QRenderPass())
    , m_passCriterion(new Qt3DRender::QAnnotation(this))
{

    m_gl3Technique->graphicsApiFilter()->setProfile(Qt3DRender::QGraphicsApiFilter::NoProfile);
    m_gl3Technique->graphicsApiFilter()->setApi(Qt3DRender::QGraphicsApiFilter::OpenGL);
    m_gl3Technique->graphicsApiFilter()->setMajorVersion(3);
    m_gl3Technique->graphicsApiFilter()->setMinorVersion(3);

    m_gl2Technique->graphicsApiFilter()->setApi(Qt3DRender::QGraphicsApiFilter::OpenGL);
    m_gl2Technique->graphicsApiFilter()->setMajorVersion(2);
    m_gl2Technique->graphicsApiFilter()->setMinorVersion(0);
    m_gl2Technique->graphicsApiFilter()->setProfile(Qt3DRender::QGraphicsApiFilter::NoProfile);


    m_passCriterion->setName(QStringLiteral("pass"));
    m_passCriterion->setValue(QStringLiteral("geometry"));

    Qt3DRender::QShaderProgram *gl3Shader = new Qt3DRender::QShaderProgram();
    gl3Shader->setVertexShaderCode(Qt3DRender::QShaderProgram::loadSource(QUrl(QStringLiteral("qrc:/geometry_gl3.vert"))));
    gl3Shader->setFragmentShaderCode(Qt3DRender::QShaderProgram::loadSource(QUrl(QStringLiteral("qrc:/geometry_gl3.frag"))));

    m_gl3Pass->addAnnotation(m_passCriterion);
    m_gl3Pass->setShaderProgram(gl3Shader);
    m_gl3Technique->addPass(m_gl3Pass);

    Qt3DRender::QShaderProgram *gl2Shader = new Qt3DRender::QShaderProgram();
    gl2Shader->setVertexShaderCode(Qt3DRender::QShaderProgram::loadSource(QUrl(QStringLiteral("qrc:/geometry_gl2.vert"))));
    gl2Shader->setFragmentShaderCode(Qt3DRender::QShaderProgram::loadSource(QUrl(QStringLiteral("qrc:/geometry_gl2.frag"))));

    m_gl2Pass->addAnnotation(m_passCriterion);
    m_gl2Pass->setShaderProgram(gl2Shader);
    m_gl2Technique->addPass(m_gl2Pass);

    addTechnique(m_gl3Technique);
    addTechnique(m_gl2Technique);
}
コード例 #8
0
veMaterial* veDeferredRenderPipeline::createSpotLightMaterial(veLight *light)
{
    auto material = new veMaterial;
    auto technique = new veTechnique;
    auto pass0 = new vePass;
    auto pass1 = new vePass;
    material->addTechnique(technique);
    technique->addPass(pass0);
    technique->addPass(pass1);
    
    pass0->setRenderPass(vePass::FORWARD_PASS);
    pass0->depthTest() = true;
    pass0->depthWrite() = false;
    pass0->stencilTest() = true;
    pass0->cullFace() = false;
    pass0->stencilFunc() = { GL_ALWAYS, 0, 0, GL_ALWAYS, 0, 0 };
    pass0->stencilOp() = { GL_KEEP, GL_DECR_WRAP, GL_KEEP, GL_KEEP, GL_INCR_WRAP, GL_KEEP };
    pass0->blendFunc() = veBlendFunc::DISABLE;
    pass0->setShader(new veShader(veShader::VERTEX_SHADER, WORLD_BASED_LIGHT_VERTEX_SHADER));
    pass0->setShader(new veShader(veShader::FRAGMENT_SHADER, "layout(location=0) out vec4 fragColor;void main(){}"));
    pass0->addUniform(new veUniform("u_ModelViewProjectMat", MVP_MATRIX));
    pass0->setApplyFunctionCallback([]() {
        glClear(GL_STENCIL_BUFFER_BIT);
        glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
    });
    
    initLightCommomParams(light, pass1);
    pass1->setRenderPass(vePass::FORWARD_PASS);
    pass1->depthTest() = false;
    pass1->depthWrite() = false;
    pass1->stencilTest() = true;
    pass1->cullFace() = true;
    pass1->cullFaceMode() = GL_FRONT;
    pass1->blendFunc().src = GL_ONE;
    pass1->blendFunc().dst = GL_ONE;
    pass1->blendEquation() = GL_FUNC_ADD;
    pass1->stencilFunc() = { GL_NOTEQUAL, 0, 0xFF, GL_NOTEQUAL, 0, 0xFF };
    pass1->setShader(new veShader(veShader::VERTEX_SHADER, WORLD_BASED_LIGHT_VERTEX_SHADER));
    pass1->setShader(new veShader(veShader::FRAGMENT_SHADER, SPOT_LIGHT_FRAGMENT_SHADER));
    pass1->addUniform(new veUniform("u_ModelViewProjectMat", MVP_MATRIX));
    pass1->addUniform(new veUniform("u_lightDirection", veVec3(0.0f)));
    pass1->addUniform(new veUniform("u_lightPosition", veVec3(0.0f)));
    pass1->addUniform(new veUniform("u_lightMatrix", veMat4::IDENTITY));
    pass1->addUniform(new veUniform("u_lightARI", 0.0f));
    pass1->addUniform(new veUniform("u_lightInnerAngleCos", 0.0f));
    pass1->addUniform(new veUniform("u_lightOuterAngleCos", 0.0f));
    pass1->addUniform(new veUniform("u_shadowTex", 4));
    pass1->setApplyFunctionCallback([]() {
        glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
    });
    
    return material;
}
コード例 #9
0
	//---------------------------------------------------------------------
	MaterialPtr TerrainMaterialGeneratorC::SM2Profile::generate(const Terrain* terrain)
	{
		// re-use old material if exists
		MaterialPtr mat = terrain->_getMaterial();
		if (mat.isNull())
		{
			MaterialManager& matMgr = MaterialManager::getSingleton();
 
			// it's important that the names are deterministic for a given terrain, so
			// use the terrain pointer as an ID
			const String& matName = terrain->getMaterialName();
			mat = matMgr.getByName(matName);
			if (mat.isNull())
			{
				mat = matMgr.create(matName, ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME);
			}
		}
		// clear everything
		mat->removeAllTechniques();
 
		addTechnique(mat, terrain, HIGH_LOD);
 
		// LOD
		if(mCompositeMapEnabled)
		{
			addTechnique(mat, terrain, LOW_LOD);
			Material::LodValueList lodValues;
			lodValues.push_back(TerrainGlobalOptions::getSingleton().getCompositeMapDistance());
			mat->setLodLevels(lodValues);
			Technique* lowLodTechnique = mat->getTechnique(1);
			lowLodTechnique->setLodIndex(1);
		}
 
		updateParams(mat, terrain);
 
		return mat;
 
	}
コード例 #10
0
ファイル: raycloudplot.cpp プロジェクト: kitizz/nutmeg
QMaterial *RayCloudPlot::makeMaterial()
{
    auto mat = new QMaterial();
    auto eff = new QEffect(mat);

    mat->addParameter(m_linewidthParam);
    mat->addParameter(m_pixelSize);
    mat->addParameter(m_colorParam);

    // Set up the shader
    auto gl3tech = new QTechnique();
    auto api = gl3tech->graphicsApiFilter();
    api->setApi(QGraphicsApiFilter::OpenGL);
//    api->setMajorVersion(3);
//    api->setMinorVersion(1);
//    api->setProfile(QGraphicsApiFilter::CoreProfile);
    api->setMajorVersion(2);
    api->setMinorVersion(0);
    api->setProfile(QGraphicsApiFilter::NoProfile);

    // Forward render
    auto ann = new QAnnotation();
    ann->setName("renderingStyle");
    ann->setValue("forward");

    // Shader render pass
    auto gl3program = new QShaderProgram();
    gl3program->setVertexShaderCode(QShaderProgram::loadSource(QUrl("qrc:/shaders/ray.vert")));
    gl3program->setFragmentShaderCode(QShaderProgram::loadSource(QUrl("qrc:/shaders/ray.frag")));

    auto gl3pass = new QRenderPass();
    gl3pass->setShaderProgram(gl3program);

//    auto pointsize = new QPointSize();
//    pointsize->setEnabled(true);
//    gl3pass->addRenderState(pointsize);

//    auto cullface = new QCullFace();
//    cullface->setMode(QCullFace::Front);
//    cullface->setEnabled(true);
//    gl3pass->addRenderState(cullface);

    gl3tech->addAnnotation(ann);
    gl3tech->addPass(gl3pass);

    // Push it all in
    eff->addTechnique(gl3tech);
    mat->setEffect(eff);
    return mat;
}
コード例 #11
0
veMaterial* veDeferredRenderPipeline::createAmbientLightMaterial()
{
    auto material = new veMaterial;
    auto technique = new veTechnique;
    auto pass = new vePass;
    material->addTechnique(technique);
    technique->addPass(pass);
    
    pass->setRenderPass(vePass::FORWARD_PASS);
    pass->depthTest() = false;
    pass->depthWrite() = false;
    pass->stencilTest() = false;
    pass->cullFace() = true;
    pass->cullFaceMode() = GL_BACK;
    pass->blendFunc().src = GL_ONE;
    pass->blendFunc().dst = GL_ONE;
    pass->blendEquation() = GL_FUNC_ADD;
    pass->setShader(new veShader(veShader::VERTEX_SHADER, SCREEN_BASED_LIGHT_VERTEX_SHADER));
    pass->setShader(new veShader(veShader::FRAGMENT_SHADER, AMBIENT_LIGHT_FRAGMENT_SHADER));
    pass->addUniform(new veUniform("u_ambient", veVec3::ZERO));
    pass->addUniform(new veUniform("u_RT1", 0));
    
    return material;
}
コード例 #12
0
ファイル: sketchPre.cpp プロジェクト: omartinak/pgpPainter
bool SketchPre::define_techniques()
{
	addTechnique(new sketchPreTechnique());
	return true;
}
コード例 #13
0
	//-----------------------------------------------------------------------
	ParticleTechnique* ParticleSystem::createTechnique(void)
	{
		ParticleTechnique* technique = ParticleSystemManager::getSingletonPtr()->createTechnique();
		addTechnique(technique);
		return technique;
	}
コード例 #14
0
ファイル: sketchPost.cpp プロジェクト: omartinak/pgpPainter
bool SketchPost::define_techniques()
{
	addTechnique(new SketchPostTechnique());
	return true;
}