本文整理汇总了C++中Shaders类的典型用法代码示例。如果您正苦于以下问题:C++ Shaders类的具体用法?C++ Shaders怎么用?C++ Shaders使用的例子?那么, 这里精选的类代码示例或许可以为您提供帮助。
在下文中一共展示了Shaders类的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1:
void
PointDrawable::setupState()
{
// Create the singleton state set for the shader. This stateset will be
// shared by all PointDrawable instances so OSG will sort them together.
if (!_sharedStateSet.valid())
{
static Threading::Mutex s_mutex;
s_mutex.lock();
if (!_sharedStateSet.valid())
{
_sharedStateSet = new osg::StateSet();
_sharedStateSet->setTextureAttributeAndModes(0, new osg::PointSprite(), osg::StateAttribute::ON);
if (_gpu)
{
VirtualProgram* vp = VirtualProgram::getOrCreate(_sharedStateSet.get());
Shaders shaders;
shaders.load(vp, shaders.PointDrawable);
_sharedStateSet->setMode(GL_PROGRAM_POINT_SIZE, 1);
}
else
{
//todo
}
s_isCoreProfile = Registry::capabilities().isCoreProfile();
}
s_mutex.unlock();
}
}
示例2:
void
ContourMap::onUninstall(TerrainEngineNode* engine)
{
if ( engine )
{
osg::StateSet* stateset = engine->getStateSet();
if ( stateset )
{
stateset->removeUniform( _xferMin.get() );
stateset->removeUniform( _xferRange.get() );
stateset->removeUniform( _xferSampler.get() );
stateset->removeUniform( _opacityUniform.get() );
stateset->removeTextureAttribute( _unit, osg::StateAttribute::TEXTURE );
VirtualProgram* vp = VirtualProgram::get(stateset);
if ( vp )
{
Shaders pkg;
pkg.unload(vp, pkg.ContourMap_Vertex);
pkg.unload(vp, pkg.ContourMap_Fragment);
}
}
if ( _unit >= 0 )
{
engine->getResources()->releaseTextureImageUnit( _unit );
_unit = -1;
}
}
}
示例3: composeMain
void ShaderComposer::addShaderToProgram(Program* program, const Shaders& shaders)
{
ShaderMainMap::iterator itr = _shaderMainMap.find(shaders);
if (itr == _shaderMainMap.end())
{
// no vertex shader in map yet, need to compose a new main shader
osg::Shader* mainShader = composeMain(shaders);
_shaderMainMap[shaders] = mainShader;
program->addShader(mainShader);
}
else
{
program->addShader(itr->second.get());
}
for(Shaders::const_iterator itr = shaders.begin();
itr != shaders.end();
++itr)
{
Shader* shader = const_cast<Shader*>(*itr);
if (!(shader->getShaderSource().empty()) || shader->getShaderBinary())
{
program->addShader(shader);
}
}
}
示例4:
void
BumpMapTerrainEffect::onUninstall(TerrainEngineNode* engine)
{
osg::StateSet* stateset = engine->getStateSet();
if ( stateset )
{
if ( _bumpMapTex.valid() )
{
stateset->removeUniform("oe_bumpmap_maxRange");
stateset->removeUniform("oe_bumpmap_octaves");
stateset->removeUniform( _scaleUniform.get() );
stateset->removeUniform( _intensityUniform.get() );
stateset->removeUniform( _bumpMapTexUniform.get() );
stateset->removeTextureAttribute( _bumpMapUnit, osg::StateAttribute::TEXTURE );
}
VirtualProgram* vp = VirtualProgram::get(stateset);
if ( vp )
{
Shaders pkg;
pkg.unloadAll( vp );
}
}
if ( _bumpMapUnit >= 0 )
{
engine->getResources()->releaseTextureImageUnit( _bumpMapUnit );
_bumpMapUnit = -1;
}
}
示例5: SetFarPlaneUniformCallback
void
LogarithmicDepthBuffer::install(osg::Camera* camera)
{
if ( camera && _supported )
{
// install the shader component:
osg::StateSet* stateset = camera->getOrCreateStateSet();
if ( _useFragDepth )
{
stateset->addUniform( new osg::Uniform(C_UNIFORM, (float)NEAR_RES_COEFF) );
}
VirtualProgram* vp = VirtualProgram::getOrCreate( stateset );
Shaders pkg;
if ( _useFragDepth )
{
pkg.loadFunction( vp, pkg.LogDepthBuffer_VertFile );
pkg.loadFunction( vp, pkg.LogDepthBuffer_FragFile );
}
else
{
pkg.loadFunction( vp, pkg.LogDepthBuffer_VertOnly_VertFile );
}
osg::ref_ptr<osg::Camera::DrawCallback> next = camera->getPreDrawCallback();
if ( dynamic_cast<SetFarPlaneUniformCallback*>(next.get()) )
next = static_cast<SetFarPlaneUniformCallback*>(next.get())->_next.get();
stateset->addUniform( _FCUniform.get() );
camera->setPreDrawCallback( new SetFarPlaneUniformCallback(_FCUniform.get(), next.get()) );
}
}
示例6:
void
BumpMapTerrainEffect::onInstall(TerrainEngineNode* engine)
{
if ( engine && _bumpMapTex.valid() )
{
osg::StateSet* stateset = engine->getTerrainStateSet();
// install the NormalMap texture array:
if ( engine->getResources()->reserveTextureImageUnit(_bumpMapUnit, "BumpMap") )
{
// NormalMap sampler
_bumpMapTexUniform = stateset->getOrCreateUniform(BUMP_SAMPLER, osg::Uniform::SAMPLER_2D);
_bumpMapTexUniform->set( _bumpMapUnit );
stateset->setTextureAttribute( _bumpMapUnit, _bumpMapTex.get(), osg::StateAttribute::ON );
// configure shaders
VirtualProgram* vp = VirtualProgram::getOrCreate(stateset);
Shaders package;
package.define( "OE_USE_NORMAL_MAP", engine->normalTexturesRequired() );
package.loadFunction( vp, package.VertexModel );
package.loadFunction( vp, package.VertexView );
package.loadFunction( vp, _octaves <= 1? package.FragmentSimple : package.FragmentProgressive );
if ( _octaves > 1 )
stateset->addUniform(new osg::Uniform("oe_bumpmap_octaves", _octaves));
stateset->addUniform(new osg::Uniform("oe_bumpmap_maxRange", _maxRange));
stateset->addUniform( _scaleUniform.get() );
stateset->addUniform( _intensityUniform.get() );
}
}
}
示例7:
void
LogarithmicDepthBuffer::uninstall(osg::Camera* camera)
{
if ( camera && _supported )
{
SetFarPlaneUniformCallback* dc = dynamic_cast<SetFarPlaneUniformCallback*>(camera->getPreDrawCallback());
if ( dc )
{
osg::ref_ptr<osg::Camera::DrawCallback> next = dc->_next.get();
camera->setPreDrawCallback( next.get() );
}
osg::StateSet* stateset = camera->getStateSet();
if ( stateset )
{
VirtualProgram* vp = VirtualProgram::get( camera->getStateSet() );
if ( vp )
{
Shaders pkg;
pkg.unloadFunction( vp, pkg.LogDepthBuffer_FragFile );
pkg.unloadFunction( vp, pkg.LogDepthBuffer_VertFile );
pkg.unloadFunction( vp, pkg.LogDepthBuffer_VertOnly_VertFile );
}
stateset->removeUniform( FC_UNIFORM );
stateset->removeUniform( C_UNIFORM );
}
}
}
示例8: main
int main( int argc, char **argv ) {
try {
size_t N = 13;
size_t bufSize = 4 * N;
float *buf = new float[bufSize];
for( size_t i = 0; i < N; ++i ) {
buf[4*i] = cosf( 2 * 3.1415f * float( i ) / float( N - 1 ) );
buf[4*i+1] = sinf( 2 * 3.1415f * float( i ) / float( N - 1 ) );
buf[4*i+2] = 0.0f;
buf[4*i+3] = 1.0f;
std::cout << buf[4*i] << " " << buf[4*i+1];
std::cout << " " << buf[4*i+2] << " " << buf[4*i+3] << "\n";
}
Shaders shaders;
shaders.addToVertexList( nBodyShaders::vertex1 );
shaders.addToFragmentList( nBodyShaders::fragment1 );
NBodyWindow window{ "N-Body Simulation", GlutWrapper::NDEBUG };
window.init( argc, argv, 500, 500, &shaders, bufSize, buf );
window.run();
delete [] buf;
return 0;
} catch( const std::exception &e ) {
std::cerr << "Error: " << e.what() << "\n";
return 1;
}
}
示例9: attach
void FogEffect::attach( osg::StateSet* stateSet )
{
VirtualProgram* vp = VirtualProgram::getOrCreate( stateSet );
Shaders pkg;
pkg.load( vp, pkg.Fog_Vertex );
pkg.load( vp, pkg.Fog_Fragment );
_statesets.push_back(stateSet);
}
示例10:
void
DepthOffsetAdapter::setGraph(osg::Node* graph)
{
if ( !_supported ) return;
bool graphChanging =
_graph.get() != graph;
bool uninstall =
(_graph.valid() && _graph->getStateSet()) &&
(graphChanging || (_options.enabled() == false));
bool install =
(graph && graphChanging ) ||
(graph && (_options.enabled() == true));
// shader package:
Shaders shaders;
if ( uninstall )
{
OE_TEST << LC << "Removing depth offset shaders" << std::endl;
// uninstall uniforms and shaders.
osg::StateSet* s = _graph->getStateSet();
s->removeUniform( _minBiasUniform.get() );
s->removeUniform( _maxBiasUniform.get() );
s->removeUniform( _minRangeUniform.get() );
s->removeUniform( _maxRangeUniform.get() );
shaders.unloadFunction( VirtualProgram::get(s), shaders.DepthOffsetVertex );
}
if ( install )
{
OE_TEST << LC << "Installing depth offset shaders" << std::endl;
// install uniforms and shaders.
osg::StateSet* s = graph->getOrCreateStateSet();
s->addUniform( _minBiasUniform.get() );
s->addUniform( _maxBiasUniform.get() );
s->addUniform( _minRangeUniform.get() );
s->addUniform( _maxRangeUniform.get() );
shaders.loadFunction(VirtualProgram::getOrCreate(s), shaders.DepthOffsetVertex);
}
if ( graphChanging )
{
_graph = graph;
}
// always set Dirty when setGraph is called sine it may be called anytime
// the subgraph changes (as can be detected by a computeBound)
_dirty = (_options.automatic() == true);
}
示例11: detach
void FogEffect::detach( osg::StateSet* stateSet )
{
VirtualProgram* vp = VirtualProgram::get(stateSet);
if ( vp )
{
Shaders pkg;
pkg.unload( vp, pkg.Fog_Vertex );
pkg.unload( vp, pkg.Fog_Fragment );
}
}
示例12:
void
AlphaEffect::detach(osg::StateSet* stateset)
{
if ( stateset && _installed )
{
stateset->removeUniform( _alphaUniform.get() );
VirtualProgram* vp = VirtualProgram::get( stateset );
if ( vp )
{
Shaders pkg;
pkg.unload( vp, pkg.AlphaEffectFragment );
}
}
}
示例13:
void
DrawInstanced::remove(osg::StateSet* stateset)
{
if ( !stateset )
return;
VirtualProgram* vp = VirtualProgram::get(stateset);
if ( !vp )
return;
Shaders pkg;
pkg.unload( vp, pkg.InstancingVertex );
stateset->removeUniform("oe_di_postex_TBO");
}
示例14: Draw
void Mesh::Draw(Shaders & shader)
{
unsigned int diffuseNr = 1;
unsigned int specularNr = 1;
unsigned int normalNr = 1;
unsigned int heightNr = 1;
for(size_t i = 0; i < this->_textures.size(); i++)
{
glActiveTexture(GL_TEXTURE0 + i); // activate proper texture unit before binding
// retrieve texture number (the N in diffuse_textureN)
std::string number;
std::string name = this->_textures[i]._type;
if(name == "texture_diffuse")
number = std::to_string(diffuseNr++);
else if(name == "texture_specular")
number = std::to_string(specularNr++);
else if(name == "texture_normal")
number = std::to_string(normalNr++);
else if(name == "texture_height")
number = std::to_string(heightNr++);
glUniform1i(glGetUniformLocation(shader.ID(), (name + number).c_str()), i);
glBindTexture(GL_TEXTURE_2D, this->_textures[i]._id);
}
// draw mesh
glBindVertexArray(VAO);
glDrawElements(GL_TRIANGLES, this->_indices.size(), GL_UNSIGNED_INT, 0);
glBindVertexArray(0);
glActiveTexture(GL_TEXTURE0);
}
示例15: _tmain
int _tmain(int argc, _TCHAR* argv[])
{
ESContext esContext;
esInitContext ( &esContext );
esCreateWindow ( &esContext, "Hello Model", Globals::screenWidth, Globals::screenHeight, ES_WINDOW_RGB | ES_WINDOW_DEPTH);
if ( Init ( &esContext ) != 0 )
return 0;
if (ppShaders.Init("../Resources/Shaders/PPShaderVS.vs", "../Resources/Shaders/PPShaderFS.fs") != 0)
return 0;
esRegisterDrawFunc ( &esContext, Draw );
esRegisterUpdateFunc ( &esContext, Update );
esRegisterKeyFunc ( &esContext, Key);
esMainLoop ( &esContext );
//releasing OpenGL resources
CleanUp();
//identifying memory leaks
MemoryDump();
printf("Press any key...\n");
_getch();
return 0;
}