查看: 1878|回复: 15

新手求助:模型局部着色问题

[复制链接]

该用户从未签到

发表于 2012-7-31 20:53:41 | 显示全部楼层 |阅读模式
     最近一直在看着色器这部分的内容,对于模型的局部比较感兴趣,譬如符合条件的几个面进行着色,其余的面不变。可练习的教程例子大多针对模型整体,采用顶点着色器或片元着色器。请问,假如我有一个房子模型,窗沿以上全是灰色,窗户下面都是棕色,这个特定条件的着色能否通过osg::shader这部分知识得到?如果不能,跪求思路破解~
  • TA的每日心情
    开心
    2019-11-11 10:36
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2012-7-31 23:37:00 | 显示全部楼层
    osg::Shader可以获取到顶点,从而可以得到顶点的位置关系,你说的根据高度判断,有顶点了就应该可以吧。   

    该用户从未签到

    发表于 2012-8-1 07:53:42 | 显示全部楼层
    设定你的窗户高度 通过uniform传递 在根据你的vertex进行比较

    该用户从未签到

     楼主| 发表于 2012-8-1 08:50:05 | 显示全部楼层
    FreeSouth 发表于 2012-7-31 23:37
    osg::Shader可以获取到顶点,从而可以得到顶点的位置关系,你说的根据高度判断,有顶点了就应该可以吧。

    请您再详细的解释下高度判断与顶点位置,我现在设置了高度筛选条件,利用着色器获得顶点,完后如何去做?新手跪求

    该用户从未签到

     楼主| 发表于 2012-8-1 09:03:19 | 显示全部楼层
    liuzhiyu123 发表于 2012-8-1 07:53
    设定你的窗户高度 通过uniform传递 在根据你的vertex进行比较

    有点明白了。。我想要用顶点着色器中的gl_Position和房屋高度Height做出这个效果,让整个建筑物高于Height的地方全变色,不过对于您说的uniform传递不太了解,还请赐教哈~

    该用户从未签到

    发表于 2012-8-1 09:19:38 | 显示全部楼层
    uniform  就是你传进来的height

    该用户从未签到

     楼主| 发表于 2012-8-1 10:29:45 | 显示全部楼层
    liuzhiyu123 发表于 2012-8-1 09:19
    uniform  就是你传进来的height

    最后问一下,我有个小想法,但老是报错:
             顶点着色器定义区域,定义一个origin,之后<osg::Uniform>origin,然后origin->get(Height)
             我本意是想让着色器从我设置的origin为起点开始着色,但是爆出很多错误~希望您给点提示


    以下是定义着色器:
      static const char *vertSource={
             "varying vec3 normal;\n"
             "uniform vec3 origin;  \n"
             "void main()               \n"
             "{                              \n"
             "    normal=normalize(gl_NormalMatrix * gl_Normal);   \n"
             "   gl_Position=glModelViewProjectionMatrix * gl_Vertex;  \n"
             "}                              \n"

    该用户从未签到

    发表于 2012-8-1 17:47:42 | 显示全部楼层
    您给出的代码本身没有说明什么问题

    该用户从未签到

     楼主| 发表于 2012-8-1 21:47:37 | 显示全部楼层
    array 发表于 2012-8-1 17:47
    您给出的代码本身没有说明什么问题

    正如楼上所说的, 我已经设定了一个高度Height,通过osg::Uniform传递, ->get(Height)。对于他所说的此高度与模型顶点比较我也理解,可我不清楚比较之后,用什么方法或是语句能够实现符合条件的部分着色?还望指教

    该用户从未签到

    发表于 2012-8-2 08:03:34 | 显示全部楼层
    在vertex中比较高度  生成varying 传递给 frag ,在frag中通过生成varying 进行颜色的选定

    该用户从未签到

     楼主| 发表于 2012-8-2 09:22:08 | 显示全部楼层
    liuzhiyu123 发表于 2012-8-2 08:03
    在vertex中比较高度  生成varying 传递给 frag ,在frag中通过生成varying 进行颜色的选定

    您别笑话我哈,我这osg才刚入门没几天,着色器那部分只看过王锐老师书上的那个牛变色。以下是我写的代码,意思是3米以上全变色,请您指点下,看看我缺少什么导致无效果
    #include <osgViewer/Viewer>
    #include <osgDB/ReadFile>
    #include <osg/Program>
    #include <osg/Shader>
    #include <osg/Uniform>
    #include <osgViewer/ViewerEventHandlers>

    //写一个顶点着色器
    static const char* vertShader = {
            "uniform float height=gl_Vertex.z;\n"
            "varying vec4 color;\n"
            "void main(void)\n"
            "{\n"
            "        color = gl_Vertex.z;\n"
            "        gl_Position = gl_ModelViewProjectionMatrix*gl_Vertex;\n"
            "}\n"
    };

    //片元着色器
    static const char* fragShader = {
            "vec4 color=osg::Vec4(0.8f,0.2f,0.1f,1.0f);\n"
            "void main(void)\n"
            "{\n"
            "        gl_FragColor = color;\n"
            "}\n"
    };

    int main()
    {
            osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer;


            osg::Node* node1 = osgDB::readNodeFile("X1.osg");
            osg::StateSet* stateset = node1->getOrCreateStateSet();
            osg:rogram* program = new osg::Program;
            program->addShader(new osg::Shader(osg::Shader::VERTEX, vertShader));
            program->addShader(new osg::Shader(osg::Shader::FRAGMENT, fragShader));
           
            osg::ref_ptr <osg::Uniform> height=new osg::Uniform("uniform",3.0f);
            stateset->addUniform(height);
           
            stateset->setAttributeAndModes(program, osg::StateAttribute::ON);

            viewer->addEventHandler(new osgViewer::WindowSizeHandler);
            viewer->setSceneData(node1);
            viewer->run();
            return 0;
    }

    该用户从未签到

    发表于 2012-8-2 09:46:10 | 显示全部楼层
    额.....完全不是这个样子的

    该用户从未签到

     楼主| 发表于 2012-8-2 09:49:21 | 显示全部楼层
    liuzhiyu123 发表于 2012-8-2 09:46
    额.....完全不是这个样子的

    好吧~您给点提示吧~这个GLSL着色器真的木有理解,例子太少了~

    该用户从未签到

    发表于 2012-8-2 10:01:45 | 显示全部楼层
    例子很多 主要是您的先明白着色器是怎么回事 电子书一大堆 《opengl作色语言》

    该用户从未签到

     楼主| 发表于 2012-8-2 10:08:32 | 显示全部楼层
    liuzhiyu123 发表于 2012-8-2 10:01
    例子很多 主要是您的先明白着色器是怎么回事 电子书一大堆 《opengl作色语言》

    好的,我去先看看~过几天不懂了再问您哈~

    该用户从未签到

    发表于 2012-8-3 16:39:40 | 显示全部楼层
    顶了
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

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

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

    联系我们

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