查看: 2284|回复: 6

求助:渲染到纹理

[复制链接]

该用户从未签到

发表于 2009-6-18 02:15:24 | 显示全部楼层 |阅读模式
我的程序要做的事情如下:
1.将纹理贴到shapefile的二维图形上.
2.将贴好纹理后的shapfile node渲染到一个纹理,同时保存为一个bmp文件.
整个项目的代码如下:[local]1[/local]
其中:HowtoTexture和HowtoTexture2D负责给shapefile贴纹理.
HowtoPreRender中的静态方法用来将贴好纹理的shapefile node渲染到一个纹理.同时HowtoPreRender也是一个Callback在被callback的时候将纹理图片保存到磁盘.

现在的问题是:
1.如果把贴好纹理的shapfile node直接拿到viewer显示 可以很清晰地看到纹理已经贴好了.
2.可是渲染到纹理后,在viewer里面看到就是一个黑色块,而且输出的图片很模糊,基本上都看快看不到原来的节点上有纹理了.

王锐老大有空的时候帮忙看一下.给指点一下.急用

该用户从未签到

 楼主| 发表于 2009-6-18 02:18:23 | 显示全部楼层
附件太大 上传失败了 再发一次
HowtoPreRender.rar (1.48 MB, 下载次数: 236)

该用户从未签到

发表于 2009-6-18 03:43:14 | 显示全部楼层

王锐老大有空的时候看一下~~~~

PS:传附件的时候不用传那么多,,很多没用的东西都上传了~~~

该用户从未签到

 楼主| 发表于 2009-6-18 07:56:32 | 显示全部楼层
FlySky大哥 3点多还没睡 太厉害了!
你也给看看阿!
从你的书上copy的代码然后自己小修改了一下. 出来的结果不是很理想阿.
每次我把你好好的例子,修改后都绘出点毛病.  哈哈  水平太菜 .

该用户从未签到

发表于 2009-6-18 12:23:59 | 显示全部楼层
麻烦您能否把有问题的地方精简一下,或者自行对照osgprerender的处理过程检查可能的问题所在;我个人很难一下子读透这么大段,而且代码风格各有不同的程序。此外由于VS版本等原因,我也看不到程序执行的结果,抱歉不能给您更多帮助

该用户从未签到

 楼主| 发表于 2009-6-21 14:32:14 | 显示全部楼层
下面是主要的代码:
其中preRender是入口函数 只要提供一个节点给他就可以了.
createPreNode是做RTT效果的函数.
  1. #include "HowtoPreRender.h"
  2. HowtoPreRender::HowtoPreRender(Image* image)
  3. {
  4.   mImage=image;
  5. }

  6. HowtoPreRender::~HowtoPreRender(void)
  7. {

  8. }
  9. void HowtoPreRender::operator ()(const Camera& camera)const{

  10.   if(mImage
  11.     &&mImage->getPixelFormat()==GL_RGBA
  12.     )
  13.   {
  14.     osgDB::writeImageFile(*mImage,"C:\\image.bmp");   
  15.     mImage->dirty();
  16.   }
  17. }
  18. Node* HowtoPreRender::createPreNode(Node *graph,
  19.                                           unsigned txt_width,
  20.                                           unsigned txt_height,                                          
  21.                                           bool useImage)
  22. {
  23.   if(!graph)return NULL;
  24.   Group* parent=new Group();
  25.   Texture2D *txt2D=new Texture2D;
  26.   txt2D->setTextureSize(txt_width,txt_height);
  27.   txt2D->setInternalFormat(GL_RGBA);
  28.   txt2D->setFilter(Texture2D::MIN_FILTER,Texture2D::LINEAR);
  29.   txt2D->setFilter(Texture2D::MAG_FILTER,Texture2D::LINEAR);
  30.   Texture* txt=txt2D;

  31.   Geometry* geom=new Geometry;
  32.   geom->setSupportsDisplayList(false);
  33.   float width=1024;
  34.   float height=512;
  35.   Vec3Array *vertices=new Vec3Array;
  36.   vertices->push_back(Vec3(0.f,0.f,0.f));
  37.   vertices->push_back(Vec3(width,0.f,0.f));
  38.   vertices->push_back(Vec3(width,0.f,height));
  39.   vertices->push_back(Vec3(0.f,0.f,height));
  40.   geom->setVertexArray(vertices);

  41.   Vec2Array *txtCoords=new Vec2Array;
  42.   txtCoords->push_back(Vec2(0.f,0.f));
  43.   txtCoords->push_back(Vec2(1.f,0.f));
  44.   txtCoords->push_back(Vec2(1.f,1.f));
  45.   txtCoords->push_back(Vec2(0.f,1.f));

  46.   VertexBufferObject *vbo=new VertexBufferObject;
  47.   vertices->setVertexBufferObject(vbo);
  48.   geom->setUseVertexBufferObjects(true);

  49.   geom->setTexCoordArray(0,txtCoords);

  50.   Vec4Array *colors=new Vec4Array;
  51.   colors->push_back(Vec4(1.f,1.f,1.f,0.5f));
  52.   geom->setColorArray(colors);
  53.   geom->setColorBinding(Geometry::BIND_OVERALL);

  54.   geom->addPrimitiveSet(new DrawArrays(PrimitiveSet::QUADS,0,vertices->size()));
  55.   StateSet *states=new StateSet;
  56.   states->setTextureAttributeAndModes(0,txt,StateAttribute::ON);
  57.   geom->setStateSet(states);

  58.   Geode* geode=new Geode;
  59.   geode->addDrawable(geom);

  60.   parent->addChild(geode);

  61.   Camera* camera=new Camera;
  62.   camera->setClearColor(Vec4(0.1f,0.1f,0.3f,1.0f));
  63.   camera->setClearMask(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
  64.   BoundingSphere bs=graph->getBound();
  65.   if(!bs.valid())
  66.   {
  67.     return graph;
  68.   }

  69.   float znear=bs.radius();
  70.   float zfar=3*bs.radius();

  71.   float proj_top=0.25f*znear;
  72.   float proj_right=0.5*znear;

  73.   znear*=0.9f;
  74.   zfar*=1.1f;
  75.   camera->setProjectionMatrixAsFrustum(-proj_right,proj_right,-proj_top,proj_top,znear,zfar);
  76.   camera->setReferenceFrame(Transform::ABSOLUTE_RF);
  77.   camera->setViewMatrixAsLookAt(bs.center()-Vec3(0.f,2.f,0.f)*bs.radius(),
  78.     bs.center(),
  79.     Vec3(0.f,0.f,1.f));
  80.   camera->setViewport(0,0,txt_width,txt_height);
  81.   camera->setRenderOrder(Camera::POST_RENDER);
  82.   camera->setRenderTargetImplementation(Camera::FRAME_BUFFER_OBJECT);
  83.   if(useImage)
  84.   {
  85.     Image *img=new Image;
  86.     img->allocateImage(txt_width,txt_height,1,GL_RGBA,GL_FLOAT);
  87.     camera->attach(Camera::COLOR_BUFFER,img);
  88.     camera->setPostDrawCallback(new HowtoPreRender(img));
  89.     txt->setImage(0,img);
  90.   }else{
  91.     camera->attach(Camera::COLOR_BUFFER,txt);
  92.   }
  93.   camera->addChild(graph);
  94.   parent->addChild(camera);
  95.   return parent;
  96. }
  97. void HowtoPreRender::preRender(Group* model)
  98. {
  99.   Viewer* viewer=new Viewer;
  100.   unsigned txt_width=512;
  101.   unsigned txt_height=512;  
  102.   bool useImage=false;  
  103.   MatrixTransform * modelEx=new MatrixTransform;
  104.   Matrix mat;
  105.   mat.makeRotate(90.f,1.0f,0.0f,0.f);  
  106.   modelEx->setMatrix(mat);
  107.   modelEx->addChild(model);

  108.   Group* rootNode=new Group;
  109.   Node* howtoNode=HowtoPreRender::createPreNode(modelEx,
  110.     txt_width,txt_height,useImage);

  111.   rootNode->addChild(howtoNode);
  112.   osgUtil::Optimizer optimizer;
  113.   optimizer.optimize(rootNode);

  114.   viewer->setSceneData(rootNode);
  115.   viewer->realize();
  116.   viewer->run();
  117. }
复制代码

[ 本帖最后由 zhuliangxiong 于 2009-6-21 14:33 编辑 ]

该用户从未签到

发表于 2011-5-30 11:10:18 | 显示全部楼层
建议您现在自己大体确定一下问题之所在,这么多的代码,恐怕很难有人去花费时间来参透。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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