查看: 1170|回复: 3

灰度纹理和color纹理有什么不同?

[复制链接]

该用户从未签到

发表于 2014-6-24 09:56:04 | 显示全部楼层 |阅读模式
对模型进行纹理贴图时,纹理的颜色是“灰度还是多波段”在纹理渲染设置时有什么区别吗?我利用osgstereoimage的代码生成立体像对,这个成功了,两张照片都是灰度的。但是当我拿多波段的影像测试时,osgstereoimage中有一个函数叫做:createColorToGreyscaleStateSet(),它的实现如下:
osg::StateSet* createColorToGreyscaleStateSet()
{
    osg::StateSet* stateset = new osg::StateSet;
   
    osg:rogram* program = new osg::Program;
    stateset->setAttribute(program);
   
    const char* fragSource =
    {
        "uniform sampler2D baseTexture;\n"
        "uniform mat4 colorMatrix;\n"
        "void main(void)\n"
        "{\n"
        "    vec4 color = texture2D( baseTexture, gl_TexCoord[0].st );\n"
        "    gl_FragColor = colorMatrix * color;\n"
        "}\n"
    };
    program->addShader(new osg::Shader(osg::Shader::FRAGMENT, fragSource));
   
    stateset->addUniform(new osg::Uniform("baseTexture",0));

    osg::Matrixf colorMatrix(
        0.3f, 0.3f, 0.3f, 0.0f,
        0.59f, 0.59f, 0.59f, 0.0f,
        0.11f, 0.11f, 0.11f, 0.0f,
        0.0f, 0.0f, 0.0f, 1.0f
    );   
   
    stateset->addUniform(new osg::Uniform("colorMatrix",colorMatrix));

    return stateset;
}
用处是将渲染改成灰度的状态,在设置viewer的时候调用此接口。我发现如果不调用此接口,那么影像不论是灰度的,还是多波段的都无法显示出来。如果调用此接口,多波段的影像则显示为灰度图。下图分别是调用和未调用
“rootNode_overlap->setStateSet(createColorToGreyscaleStateSet());”的情况。
我怀疑是否在加载纹理时设置的渲染和纹理属性不对?我的设置如下:
        osg::Texture2D* texture = new osg::Texture2D;
        texture->setFilter(osg::Texture2D::MIN_FILTER,osg::Texture2D:INEAR);
        texture->setFilter(osg::Texture2D::MAG_FILTER,osg::Texture2D::LINEAR);
        texture->setWrap(osg::Texture2D::WRAP_S,osg::Texture2D::CLAMP_TO_BORDER);
        texture->setWrap(osg::Texture2D::WRAP_T,osg::Texture2D::CLAMP_TO_BORDER);
        texture->setResizeNonPowerOfTwoHint(false);
        texture->setImage(image);

        // set up the drawstate.
        osg::StateSet* dstate = new osg::StateSet;
        dstate->setMode(GL_CULL_FACE,osg::StateAttribute::OFF);
        dstate->setMode(GL_LIGHTING,osg::StateAttribute::ON);
        dstate->setTextureAttributeAndModes(0, texture,osg::StateAttribute::ON);
        dstate->setTextureAttribute(0, texmat);

        osg::Vec4Array* colors = new osg::Vec4Array();
        colors->push_back(osg::Vec4(0.0f,0.0f,0.0f,0.0f));

        osg:rawArrays* elements = new osg::DrawArrays(osg::PrimitiveSet:UADS,0,coords->size());

        geom->setVertexArray(coords);
        geom->setTexCoordArray(0,tcoords);
        geom->setColorArray(colors);
        geom->setColorBinding(osg::Geometry::BIND_OVERALL);

        geom->addPrimitiveSet(elements);

        // set up the geode.
        osg::Geode* geode = new osg::Geode;
        geode->addDrawable(geom);

请各位帮忙看一下,比较急,在线等,谢谢。

调用createColorToGreyscaleStateSet()

调用createColorToGreyscaleStateSet()

未调用

未调用

该用户从未签到

发表于 2014-6-24 11:37:56 | 显示全部楼层
如果这就是你的全部代码的话,你在不调用那个接口的情况下,你是将纯黑颜色直接设置给图元四边形,而并没启动纹理渲染。
下面是你的源码我没动,只加了注释。。。
osg::Vec4Array* colors = new osg::Vec4Array();
        colors->push_back(osg::Vec4(0.0f,0.0f,0.0f,0.0f));//纯黑颜色

        osg:rawArrays* elements = new osg:rawArrays(osg:rimitiveSet:UADS,0,coords->size());

        geom->setVertexArray(coords);
        geom->setTexCoordArray(0,tcoords);
        geom->setColorArray(colors);//将颜色设置给图元
调用了接口后才启用的纹理渲染,并且使用shader对颜色进行缩放。
这当然是如果你贴出的代码是全部代码的前提之下。

该用户从未签到

 楼主| 发表于 2014-6-24 15:22:25 | 显示全部楼层
casthc 发表于 2014-6-24 11:37
如果这就是你的全部代码的话,你在不调用那个接口的情况下,你是将纯黑颜色直接设置给图元四边形,而并没启 ...

感谢您的答复!我也是刚发现这个问题,因为是直接copy的osg例子中的代码,作为初学者不确定是哪一句出了问题,我就尝试把代码隐掉试了一下,就是纹理设置的地方不对了。我想再请教您一个问题,就是在设置透明度的时候使用setcolor去改变alpha的值吗?还是说利用其它的代码,谢谢您~

该用户从未签到

发表于 2014-6-26 09:50:24 | 显示全部楼层
是的可以使用setcolor设置alpha的值,但是必须要启用混合GL_BLEND,
我一般是用材料Material来设置颜色,并且启用混合来实现透明,差不多一样
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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