查看: 2606|回复: 8

新手求问:仿照osgCookBook中的“simple water”遇到困惑

[复制链接]

该用户从未签到

发表于 2012-11-5 23:50:14 | 显示全部楼层 |阅读模式
        最近一直做水面波纹,看到osgCookBook中的那个例子很棒,当中通过osg::createTexturedQuadGeometry()这个方法设创建了一个四边形水面(geometry类型),而后geode->addDrawable(),最后设置渲染属性和着色器的引入都是经过osg::StateSet* ss = geode->getOrCreateStateSet()实现了。
    可是当我换成自己随便绘制一个非常简单的四边形,也是geometry类型,而后加到geode节点上。。按道理,运行后我自己这个平面应该出现水面的效果——换汤不换药嘛~~可是它出现一个不正常的现象(见下图),而且抖动厉害,不像是噪声效果。。。
    各位高手请给小弟指点!

   PS:如果说我自己写的四边形没有写纹理导致的,请详细指点下,因为源码中着色器中也涉及了几个纹理,如何编写呢?

(1)部分代码
osg::ref_ptr<osg::Geometry> createLake(osg::Vec3Array *pointList)
{
        osg::ref_ptr<osg::Geometry>geom=new osg::Geometry;
                 ...........................................//画个四边形
        return geom;
}
        osg::ref_ptr<osg::Geode> geode = new osg::Geode;
        geode->addDrawable( poly.get() );

        osg::StateSet* ss = geode->getOrCreateStateSet();
        ss->setTextureAttributeAndModes( 0, tex2D.get() );
               ....................................//源代码中的设置内容我没有任何改变

(2)问题截图
1.jpg

----------------------------------------------------------------------------------------------
(1)正确的效果
2.jpg
PS:这个水平面就源代码中设置的一个geometry平面,我换个geometry就不成了。。。哎

(2)源码
源码.zip (4.88 KB, 下载次数: 48)

该用户从未签到

发表于 2012-11-6 07:44:16 | 显示全部楼层
比较createTexturedQuadGeometry中相应的实现跟您自己的实现,看看缺少哪里,加上就OK了

该用户从未签到

 楼主| 发表于 2012-11-6 18:39:29 | 显示全部楼层
liuzhiyu123 发表于 2012-11-6 07:44
比较createTexturedQuadGeometry中相应的实现跟您自己的实现,看看缺少哪里,加上就OK了

这个法子我试过了,通过对比,我发现他用的这个createTexturedQuadGeometry()方便用户快速建立一个四边形,然后贴图。。但是源码中除了这段后,并没有对它进行纹理贴图,而是在着色器区域设置的:
1、建立平面
// The water plane
    const osg::Vec3& center = scene->getBound().center();
    float planeSize = 20.0f * scene->getBound().radius();
    osg::Vec3 planeCorner( center.x()-0.5f*planeSize, center.y()-0.5f*planeSize, z );
    osg::ref_ptr<osg::Geometry> quad = osg::createTexturedQuadGeometry(
        planeCorner, osg::Vec3(planeSize, 0.0f, 0.0f), osg::Vec3(0.0f, planeSize, 0.0f) );
   
    osg::ref_ptr<osg::Geode> geode = new osg::Geode;
    geode->addDrawable( quad.get() );

2、设置纹理和着色器uniform
osg::StateSet* ss = geode->getOrCreateStateSet();
    ss->setTextureAttributeAndModes( 0, tex2D.get() );
    ss->setTextureAttributeAndModes( 1, createTexture("Images/skymap.jpg") );
    ss->setTextureAttributeAndModes( 2, createTexture("water_DUDV.jpg") );
    ss->setTextureAttributeAndModes( 3, createTexture("water_NM.jpg") );
   
    osg::ref_ptr<osg:rogram> program = new osg::Program;
    program->addShader( new osg::Shader(osg::Shader::VERTEX, waterVert) );
    program->addShader( new osg::Shader(osg::Shader::FRAGMENT, waterFrag) );
    geode->getOrCreateStateSet()->setAttributeAndModes( program.get() );
    geode->getOrCreateStateSet()->addUniform( new osg::Uniform("reflection", 0) );
    geode->getOrCreateStateSet()->addUniform( new osg::Uniform("defaultTex", 1) );
    geode->getOrCreateStateSet()->addUniform( new osg::Uniform("refraction", 2) );
    geode->getOrCreateStateSet()->addUniform( new osg::Uniform("normalTex", 3) );

    我自定义的绘制四边形方法肯定没有createTexturedQuadGeometry()这样的功效~但我在其中不能添加纹理绑定这部分内容(和源码比较,缺少的部分),因为一旦我绑定四个点纹理后,着色器的水纹和波浪就没效果了。。。况且源码中只是用了这个方法建了四边形,后面没有所谓的setImage等纹理绑定的流程。。。。。。。。。。。求各位高手指点我如何修改?

PS:附上我的代码,一楼为源码
我的代码.zip (1.25 MB, 下载次数: 30)

该用户从未签到

 楼主| 发表于 2012-11-6 18:43:49 | 显示全部楼层
我是通过鼠标点击地面,而后形成的多边形~各位高手看看我的代码,实在不行,想办法跟createTexturedQuadGeometry()靠拢也行啊~其实我的思路很简单的。。。就是不出效果

该用户从未签到

发表于 2012-11-9 10:11:59 | 显示全部楼层
检查一下您的纹理坐标吧

该用户从未签到

 楼主| 发表于 2012-11-13 16:44:42 | 显示全部楼层
array 发表于 2012-11-9 10:11
检查一下您的纹理坐标吧

这点上我还有疑惑~我将源代码中自定义的那个四边形换成其他模型,发现水面效果仍可以实现,但是情况很蹊跷,不知您能否给予解答~
  (1)问题1:我尝试加载lz.osg(OSG自带的),发现地形整体可以实现水面流动,但是为何那些树是一个个静止图片?
1.jpg
这个差异为什么产生呢??
(2)我发现源代码中的那个四边形没有线框格网样式,也就是W键切换状态。。。而我自己写的“四个点构建四边形”方法却有个线框,您说这会不会是导致我没实现理想效果的原因呢?为什么createTexturedQuadGeometry()方法构建的四边形没有线框填充方式呢?
y1.jpg

y2.jpg

该用户从未签到

 楼主| 发表于 2012-11-13 16:50:24 | 显示全部楼层
而且,您也许太忙,没看到我的代码哈~我看了下cookbook‘这个水的例子,首先是用createTexturedQuadGeometry()方法构建的四边形,随后没有对它进行纹理的绑定,而是在后面着色器代码中赋予他的初始纹理;同理,我也是用很简单的四边形绘制方法(四个点push_back,完后geom->addPrimitiveSet),同一个着色器代码,为什么没达到呢?反而仅仅出现一张图片,并且来回颤。。看的很瘆人:'(

该用户从未签到

发表于 2012-11-15 13:39:56 | 显示全部楼层
我自定义的绘制四边形方法肯定没有createTexturedQuadGeometry()这样的功效~但我在其中不能添加纹理绑定这部分内容(和源码比较,缺少的部分),因为一旦我绑定四个点纹理后,着色器的水纹和波浪就没效果了

请先解释一下这段话,就那么几行代码的一个函数,您为什么还有“不能”做的部分

该用户从未签到

发表于 2013-10-8 16:37:51 | 显示全部楼层
common.h在哪里啊,找不到呢
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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