查看: 1246|回复: 5

新手求助:着色器应用于多个模型后的死机问题

[复制链接]

该用户从未签到

发表于 2013-3-22 10:14:17 | 显示全部楼层 |阅读模式
本帖最后由 mxl12315 于 2013-3-22 10:48 编辑

      最近将砖块着色器的例子改了一下,用于实现固定高度以上(下)的着色效果。给与一个高度值,高于这个height的着红色,相反则着绿色。
     目前,着色器运行正常,无报错异常,我在场景中加载了六个模型,模型加载的方式均为:
        osg::Node *model1 = osgDB::readNodeFile("*****.3DM");
        osg::MatrixTransform* mt1 = new osg::MatrixTransform;
        mt1->setMatrix(osg::Matrix::translate(osg::Vec3(150,0,0)));
        mt1->addChild(model2);

效果没问题:
1.jpg

可是,当我继续加载模型,哪怕加一个。。。程序运行后就死了。。。着色器效果没有,而且场景也定住了。我开始以为模型是不是复杂了,顶点和片元着色器需要处理时间,可是我等了半小时,多加了一个模型就一直这样~加载方式还都是一样

截图:
2.jpg

请教各位高手,难道着色器不能应用于大场景吗?效率我真没希望什么,但是不是效果要出现呢?

着色器代码:

//定义着色器的源代码
static const char* vertexShader = {
        "varying float MCposition; \n"
        "uniform float BrickSize;\n"

        "attribute vec4 gl_MultiTexCoord0;\n"

        "void main()\n"
        "{\n"
        "    MCposition=gl_Vertex.z; \n"
        "    gl_Position = ftransform();\n"
        "    gl_TexCoord[0]  = gl_MultiTexCoord0;\n"
        "}\n"
};

static const char* fragShader = {
        "uniform vec4 BrickColor;\n"
        "uniform float BrickSize;\n"
        "uniform float BrickPct;\n"

        "varying float MCposition;\n"

        "uniform sampler2D sourceTex; \n"


        "uniform vec4 LastColor;\n"


        "void main()\n"
        "{\n"
        "vec4 texResult = texture2D(sourceTex, gl_TexCoord[0].st); \n"

        "vec4 color;\n"
        "float position,useBrick;\n"

        "position=BrickSize-BrickPct;\n"   //筛选条件BrickSize - 坐标BrickPct 0.0  = 剩余高度position

        "useBrick=step(position,MCposition);\n"   //若高度Position > 最高点MCposition  ->0; 否则返回1

        "color=mix(LastColor,BrickColor,useBrick);\n"

        "gl_FragColor=color;\n"

        "}\n"
};

void createShaders(osg::Node *node,bool flag)
{
        osg::StateSet *stateset=node->getOrCreateStateSet();
        osg:rogram *program=new osg::Program();

        osg::Uniform *BrickColor=new osg::Uniform("BrickColor",osg::Vec4(0.8,0.0,0.0,0.3));

        osg::Uniform *sourceTex = new osg::Uniform( "sourceTex", 0);

        osg::Uniform *BrickSize=new osg::Uniform("BrickSize",height);  //height可以指定一个数值
        osg::Uniform *BrickPct=new osg::Uniform("BrickPct",0.0f);

        osg::Uniform *LastColor=new osg::Uniform("LastColor",osg::Vec4(0.0,0.8,0.0,0.3));


        program->addShader(new osg::Shader(osg::Shader::VERTEX,vertexShader));
        program->addShader(new osg::Shader(osg::Shader::FRAGMENT,fragShader));


        stateset->addUniform(LastColor);
        stateset->addUniform(BrickColor);
        stateset->addUniform(sourceTex);
        stateset->addUniform(BrickSize);
        stateset->addUniform(BrickPct);

        if (flag==true)
        {
                stateset->setAttributeAndModes(program,osg::StateAttribute::ON);
        }
        if (flag==false)
        {
                stateset->removeAttribute(osg::StateAttribute::PROGRAM);       
        }
};


main函数中:
createShaders(root->getChild(*),true);

注:root就加载了模型,其他的没有~

该用户从未签到

发表于 2013-3-22 13:25:52 | 显示全部楼层
计算机硬件性能不行,跑不动了吧,建议换个配置好的,再跑跑看....

该用户从未签到

 楼主| 发表于 2013-3-22 13:45:03 | 显示全部楼层
the_mercury 发表于 2013-3-22 13:25
计算机硬件性能不行,跑不动了吧,建议换个配置好的,再跑跑看....

您好,我的笔记本式是“联想ThinkPad W530”,配置应该没问题吧?那您看看我贴出的代码是否有错误?或者,GLSL这东东能否运用到大场景中?我指的模型高度提取这种例子?

该用户从未签到

发表于 2013-3-25 09:29:43 | 显示全部楼层
GLSL和大场景根本毫无关系,它就是一个普通的渲染状态而已,随时可以用,我只能猜测是您的代码中存在别的问题

该用户从未签到

 楼主| 发表于 2013-3-25 10:27:21 | 显示全部楼层
array 发表于 2013-3-25 09:29
GLSL和大场景根本毫无关系,它就是一个普通的渲染状态而已,随时可以用,我只能猜测是您的代码中存在别的问 ...

最诡异的事情,就是同样的代码放到不同的笔记本上,我的死机,人家的运行出效果了,而且都是这种图形工作站的本本儿。。。郁闷了,着色器部分在两台机子上都没有异常或DOS界面里有什么警告。。。难道是OPENGL版本问题?

该用户从未签到

发表于 2013-3-25 14:10:31 | 显示全部楼层
这种情况下,可能是某个glsl的函数或者语法的问题。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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