查看: 3054|回复: 6

纹理REPEAT的问题【已解】

[复制链接]

该用户从未签到

发表于 2009-7-4 15:11:04 | 显示全部楼层 |阅读模式
在网上搜过很多资料,照这样子写,就是Repeat不了,始终只贴了一个纹理。请教一下高手,我错在哪了?谢谢!
代码:
//-----头文件------//
#include <osg/Node>
#include <osg/Group>
#include <osg/Geode>
#include <osg/Geometry>
#include <osg/Texture2D>
#include <osgDB/ReadFile>
#include <osgDB/WriteFile>
#include <osgViewer/Viewer>
#include <osg/TexEnv>
#include <osg/TexGen>
#include <osg/StateSet>
#include <osgViewer/ViewerEventHandlers>
#include <osgGA/StateSetManipulator>
#include <osg/PositionAttitudeTransform>
#include <osgGA/TrackballManipulator>
#include <osg/ImageStream>

……

   osg::Geode* geode = new osg::Geode;//创建几何节点
   //画一个可体贴纹理的几何方块,并加到几何节点上(三个坐标是我个人理解,我觉得OSG做得很奇怪)
   geode->addDrawable(osg::createTexturedQuadGeometry(osg::Vec3(0.0f,0.0f,0.0f), //左下角点
                                                      osg::Vec3(230.0f,0.0f,0.0f), //右下角点
                                                      osg::Vec3(0.0f,0.0f,130.0f)));//坐上角点

   osg::Texture2D* PICT = new osg::Texture2D;   //创建二维纹理对象
   osg::Image* pure = osgDB::readImageFile("negx.gif") ;//读图片
   osg::ImageStream* ImStr = dynamic_cast<osg::ImageStream*>(pure);//设置动态
   if (ImStr) ImStr->play();//如果图片有动态,则播放
   PICT->setImage(pure);//将图片pure设为纹理

//设置为重复,我三个方向都设了,没用,它就是不重复
   PICT->setWrap(osg::Texture::WRAP_S,osg::Texture::REPEAT);
   PICT->setWrap(osg::Texture::WRAP_T,osg::Texture::REPEAT);
   PICT->setWrap(osg::Texture::WRAP_R,osg::Texture::REPEAT);

//设置纹理去黑边
   PICT->setWrap(osg::Texture::WRAP_S,osg::Texture::CLAMP_TO_EDGE);
   PICT->setWrap(osg::Texture::WRAP_T,osg::Texture::CLAMP_TO_EDGE);

  osg::StateSet* state1= new osg::StateSet();//创建渲染状态
  state1->setTextureAttributeAndModes(0,PICT,osg::StateAttribute::ON);//将纹理PICT加入到状态中
  geode->setStateSet(state1);//将状态state1设为几何节点的状态

……

[ 本帖最后由 sdd548 于 2009-7-6 16:28 编辑 ]

该用户从未签到

发表于 2009-7-6 09:44:10 | 显示全部楼层
貌似没有设置纹理坐标

该用户从未签到

 楼主| 发表于 2009-7-6 15:21:23 | 显示全部楼层
我后来试过了,在中间加了一段设置纹理坐标的代码,可是出来的还是只有一个纹理,按照我设置的坐标铺的。
osg::Geode* geode = new osg::Geode;//创建几何节点
osg::ref_ptr<osg::Geometry> geom = new osg::Geometry;//创建几何体
geom = osg::createTexturedQuadGeometry(osg::Vec3(0.0f,0.0f,0.0f),
                                                                               osg::Vec3(230.0f,0.0f,0.0f),
                                                                               osg::Vec3(0.0f,0.0f,130.0f));
    osg::ref_ptr<osg::Vec2Array> tc = new osg::Vec2Array;//创建二维数组
   geom->setTexCoordArray( 0, tc.get() );//设置纹理坐标
    tc->push_back( osg::Vec2( 0.f, 0.f ) );
   tc->push_back( osg::Vec2( 2.0f, 0.f ) );
   tc->push_back( osg::Vec2( 2.0f, 1.f ) );
   tc->push_back( osg::Vec2( 0.f, 1.f ) );
   geode->addDrawable(geom);
       
  osg::Texture2D* PICT = new osg::Texture2D;   //创建二维纹理对象
其他代码没有改动

该用户从未签到

发表于 2009-7-6 15:58:18 | 显示全部楼层
//设置纹理去黑边
PICT->setWrap(osg::Texture::WRAP_S,osg::Texture::CLAMP_TO_EDGE);
   PICT->setWrap(osg::Texture::WRAP_T,osg::Texture::CLAMP_TO_EDGE);

把这两句去掉

该用户从未签到

 楼主| 发表于 2009-7-6 16:25:07 | 显示全部楼层
我主观意向觉得,这两句对REPEAT应该没什么影响的,不过我还是虚心听从大家意见,试一试。我为了试出REPEAT都快疯了,我觉得可能是那块设置错了,大家帮忙找好原因。理论和现实咋差距就那么大嗫?

该用户从未签到

 楼主| 发表于 2009-7-6 16:28:09 | 显示全部楼层
高手啊啊!!!!!!!!!!!!!!Orz
果然是去掉就好了,敢问大侠可知为什么?因为两次->setWrap有冲突?

该用户从未签到

发表于 2009-7-6 16:38:08 | 显示全部楼层
原帖由 sdd548 于 2009-7-6 16:28 发表
高手啊啊!!!!!!!!!!!!!!Orz
果然是去掉就好了,敢问大侠可知为什么?因为两次->setWrap有冲突?


倒不是说有冲突,只不过你两次设的是同一属性的不同的值,最终的值取决于后者,你前面设的就失效了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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