查看: 3739|回复: 2

请教:OSG与Shader的结合

[复制链接]

该用户从未签到

发表于 2014-12-11 16:39:24 | 显示全部楼层 |阅读模式

我最近在做一个小程序,
"将几个贴有图像纹理的正方形节点重叠放置,
且每个正方形边缘有渐变的透明度。"

如图所示,这里有两个正方形节点。

shader使用

shader使用


我已经给左边正方形设计了一组shader,
其左边缘和右边缘逐渐透明化。

但是,我在给右边正方形也添加shader后,
发现要么右边无效果,要么就两个正方形节点都没有透明效果了。

我没找到关于shader和osg结合特别好的例子。
我找了很多opengl和shader的书。
都没有找到给多个节点同时添加shader效果的例子。

其实我对这个管线什么原理还不是特别深入了解。

请问:
        1. 原理上来说,能否同时给多个节点添加不同shader效果?
        2. 如果可以,我该怎么做?
        3. 如果原理上根本行不通,我该采取什么其他办法?

谢谢各位了

该用户从未签到

发表于 2016-3-18 11:37:20 | 显示全部楼层
1. 可以同时添加不同的Shader ,在OSG里 相当于给不同的Geode 挂不同的Shader
2. 类似下面的方法
http://blog.csdn.net/zhuyingqingfen/article/details/8656913

该用户从未签到

发表于 2017-1-11 23:20:25 | 显示全部楼层
本帖最后由 Emily 于 2017-1-11 23:21 编辑

可以同时给不同的节点添加不同的Shader,每个节点作为一个状态设置shader就行了。可以考虑把shader函数封装起来,传状态进去就可以了。
类似于这样:

void LoadShader(osg::StateSet* stateset)
{
static char * vertexShader = {  
    "varying vec4 color;\n"  
    "void main(void ){\n"  
        "color = gl_Vertex;\n"  
        "gl_Position = gl_ModelViewProjectionMatrix*gl_Vertex;\n"  
    "}\n"  
};  
static char * fragShader = {  
    "varying vec4 color;\n"  
    "void main(void){\n"  
    "   gl_FragColor = clamp(color,0.0,1.0);\n"  
    "}\n"  
};

    osg:rogram * program = new osg::Program;  
    program->addShader(new osg::Shader(osg::Shader::FRAGMENT,fragShader));  
    program->addShader(new osg::Shader(osg::Shader::VERTEX,vertexShader));  
   stateset->setAttributeAndModes(program,osg::StateAttribute::ON);  
  
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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