glsl的片段着色器中定义两个uniform变量:
uniform sampler2D tile_xyz;
uniform float tile_xyzH;
在程序中:
int unit;
Rexter->getResources()->reserveTextureImageUnit( unit, "Tile XYZ" );
osg::Uniform* tileXYZUniform=new osg::Uniform("tile_xyz", unit);
surfaceStateSet->addUniform(tileXYZUniform);
surfaceStateSet->setTextureAttributeAndModes(unit,numTexture.get(),osg::StateAttribute::ON);
float ff=newH*1.0/256;
osg::Uniform* tileXYZHUniform=new osg::Uniform("tile_xyzH", ff);
surfaceStateSet->addUniform(tileXYZHUniform);
osg内部是如此转到opengl的,调用glUniform*系列函数。
osg/Uniform.cpp
void Uniform::apply(const GLExtensions* ext, GLint location) const
{
// OSG_NOTICE << "uniform at "<<location<<" "<<_name<< std::endl;
GLsizei num = getNumElements();
if( num < 1 ) return;
switch( getGlApiType(getType()) )
{
case FLOAT:
if( _floatArray.valid() ) ext->glUniform1fv( location, num, &_floatArray->front() );
break;
case FLOAT_VEC2:
if( _floatArray.valid() ) ext->glUniform2fv( location, num, &_floatArray->front() );
break;
case FLOAT_VEC3:
if( _floa