查看: 4097|回复: 7

如何设置透明度

[复制链接]

该用户从未签到

发表于 2008-5-8 09:52:01 | 显示全部楼层 |阅读模式
对透明度的设置不清楚,请问有哪里有例子或者教程?

该用户从未签到

发表于 2008-5-8 12:49:39 | 显示全部楼层
原帖由 soda 于 2008-5-8 09:52 发表
对透明度的设置不清楚,请问有哪里有例子或者教程?


我记得Nehe的OpenGL教程第八课就是这个内容,这个教程四处都是,网上查一下好了。
基本原理是要用到颜色的Alpha分量,并使用glBlendFunc(GL_SRC_ALPHA,GL_ONE)来完成透明色的混合。对于OSG而言,对应地使用osg::Blend渲染属性应该就可以了

该用户从未签到

 楼主| 发表于 2008-5-8 14:37:03 | 显示全部楼层
谢谢版主!

该用户从未签到

 楼主| 发表于 2008-5-8 16:11:11 | 显示全部楼层
我做了一下实验,修改了一下“OSG快速入门指南”里面的state的例子。
该例子建立了两个正方形,设置不同的渲染状态并放在场景中四个不同的位置,其中左上角的正方形不改变状态。
我想把左上角的正方形变成透明的,但是并没有效果,请问哪里不对?以下是设置渲染状态属性的代码:
        osg::Matrix m;
        {
                // Upper-left: Render the drawable with default state.
                osg::ref_ptr<osg::MatrixTransform> mt = new osg::MatrixTransform;
                m.makeTranslate( -2.f, 0.f, 2.f );
                mt->setMatrix( m );
                root->addChild( mt.get() );
                mt->addChild( geode.get() );

                // Added code, to change the transparency of the Upper-left model
                osg::StateSet* state = mt->getOrCreateStateSet();
                osg::BlendColor* bc = new osg::BlendColor(osg::Vec4(1.0,  0,  0, 0));
                osg::BlendFunc* bf = new osg::BlendFunc();
                bf->setSourceAlpha(osg::BlendFunc::CONSTANT_ALPHA);
                bf->setDestinationAlpha(osg::BlendFunc::ONE_MINUS_CONSTANT_ALPHA);
                state->setAttributeAndModes(bf, osg::StateAttribute::ON );
                state->setAttributeAndModes(bc);
        }

该用户从未签到

 楼主| 发表于 2008-5-8 16:14:46 | 显示全部楼层
我做了一下实验,修改了一下“OSG快速入门指南”里面的state的例子。
该例子建立了两个正方形,设置不同的渲染状态并放在场景中四个不同的位置,其中左上角的正方形不改变状态。
我想把左上角的正方形变成透明的,但是并没有效果,请问哪里不对?以下是设置渲染状态属性的代码:
        osg::Matrix m;
        {
                // Upper-left: Render the drawable with default state.
                osg::ref_ptr<osg::MatrixTransform> mt = new osg::MatrixTransform;
                m.makeTranslate( -2.f, 0.f, 2.f );
                mt->setMatrix( m );
                root->addChild( mt.get() );
                mt->addChild( geode.get() );

                // Added code, to change the transparency of the Upper-left model
                osg::StateSet* state = mt->getOrCreateStateSet();
                osg::BlendColor* bc = new osg::BlendColor(osg::Vec4(1.0,  0,  0, 0));
                osg::BlendFunc* bf = new osg::BlendFunc();
                bf->setSourceAlpha(osg::BlendFunc::CONSTANT_ALPHA);
                bf->setDestinationAlpha(osg::BlendFunc::ONE_MINUS_CONSTANT_ALPHA);
                state->setAttributeAndModes(bf, osg::StateAttribute::ON );
                state->setAttributeAndModes(bc, osg::StateAttribute::ON );
        }

该用户从未签到

发表于 2008-5-9 01:48:01 | 显示全部楼层
绘制透明对象时应该关闭写深度缓存~~~~~~~~~如果要在深度缓存启用时,应该将透明图形按照深度进行排序,并在全部场景绘制完毕之后再绘制这些透明物体~~~~~~~

该用户从未签到

 楼主| 发表于 2008-5-9 08:52:21 | 显示全部楼层
谢谢flysky~~
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表