osg学习(四十三)如何给着色器上传 更新uniform变量

本文介绍了在OpenGL环境下,如何在glsl片段着色器中声明并更新uniform变量。通过学习,可以理解osg内部如何调用glUniform*函数来实现uniform变量的更新。
摘要由CSDN通过智能技术生成

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值