OSG的混合方程

研究對osg::BlendFunc對象的應用 使用時, 這個對象做爲attribute加到stateSet對象中: ss->setAttributeAndModes(blendfunc1, osg::StateAttribute::ON);函數

  • 各個參數:
enum BlendFuncMode {
            DST_ALPHA                = GL_DST_ALPHA,
            DST_COLOR                = GL_DST_COLOR,
            ONE                      = GL_ONE,
            ONE_MINUS_DST_ALPHA      = GL_ONE_MINUS_DST_ALPHA,
            ONE_MINUS_DST_COLOR      = GL_ONE_MINUS_DST_COLOR,
            ONE_MINUS_SRC_ALPHA      = GL_ONE_MINUS_SRC_ALPHA,
            ONE_MINUS_SRC_COLOR      = GL_ONE_MINUS_SRC_COLOR,
            SRC_ALPHA                = GL_SRC_ALPHA,
            SRC_ALPHA_SATURATE       = GL_SRC_ALPHA_SATURATE,
            SRC_COLOR                = GL_SRC_COLOR,
            CONSTANT_COLOR           = GL_CONSTANT_COLOR,
            ONE_MINUS_CONSTANT_COLOR = GL_ONE_MINUS_CONSTANT_COLOR,
            CONSTANT_ALPHA           = GL_CONSTANT_ALPHA,
            ONE_MINUS_CONSTANT_ALPHA = GL_ONE_MINUS_CONSTANT_ALPHA,
            ZERO                     = GL_ZERO
        };

setFunction函數有兩個參數: blendfunc1->setFunction(osg::BlendFunc::SRC_ALPHA, osg::BlendFunc::ONE_MINUS_SRC_ALPHA);3d

原圖: 原始圖片 正常的顯示: 正常的狀況code

這兩個參數能夠由BlendFuncMode各個枚舉值自由組合 各類效果: 效果1 效果2 效果3對象

我打算作出由顏色值控制透明度的效果 發現這混合方程,是取片元着色器Shader的輸出值,由於有些png, 全透明的地方也是會有顏色值,上面的圖中就有這狀況, 修改了Shader解決了這一問題: 把RGB顏色乘以Alpha值blog

FragColor = vec4(vec3(textureColor.x, textureColor.y, textureColor.z)*(diff*textureColor.w), textureColor.w);

shader修改後

相關文章
相關標籤/搜索