hejingyuan199 发表于 2014-12-11 16:39:24

请教:OSG与Shader的结合


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

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


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

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

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

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

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

谢谢各位了

heishuijing2222 发表于 2016-3-18 11:37:20

1. 可以同时添加不同的Shader ,在OSG里 相当于给不同的Geode 挂不同的Shader
2. 类似下面的方法
http://blog.csdn.net/zhuyingqingfen/article/details/8656913

Emily 发表于 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::Program * 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);

}
页: [1]
查看完整版本: 请教:OSG与Shader的结合