我要发帖 回复

正式会员

3

主题

24

积分

0

专家分

:

私信
发表时间 : 2009-3-19 10:29:10 | 浏览 : 3778    评论 : 5
一门课程的作业~
有点没有头绪~~
请教各位啦~~

最近VR访客

obuil 评论于2009-3-19 11:31:02
osg是开源代码  你可以看看他的红蓝立体是怎么做的
tan_dunming 评论于2009-3-19 11:57:39
glColorMask
感觉红蓝立体效果不好
追求卓越
kinkymm 评论于2009-5-8 12:41:33
请教各位啦~马上就要结课了....
tan_dunming 评论于2009-5-8 19:31:13
之前在论坛里或者网上似乎见到过类似的介绍,后来没注意,在没有找到。

这个是OpenSceneGraph中红蓝立体的主要实现代码(SceneView.cpp中):
  1.         case(osg::DisplaySettings::ANAGLYPHIC):
  2.             {
  3.                 if( getDrawBufferValue() !=  GL_NONE)
  4.                 {
  5.                     _renderStageLeft->setDrawBuffer(getDrawBufferValue());
  6.                     _renderStageLeft->setReadBuffer(getDrawBufferValue());

  7.                     _renderStageRight->setDrawBuffer(getDrawBufferValue());
  8.                     _renderStageRight->setReadBuffer(getDrawBufferValue());
  9.                 }
  10.                
  11.                 _localStateSet->setAttribute(getViewport());

  12.                
  13.                 _renderStageLeft->drawPreRenderStages(_renderInfo,previous);
  14.                 _renderStageRight->drawPreRenderStages(_renderInfo,previous);


  15.                 // ensure that left eye color planes are active.
  16.                 osg::ColorMask* leftColorMask = _renderStageLeft->getColorMask();
  17.                 if (!leftColorMask)
  18.                 {
  19.                     leftColorMask = new osg::ColorMask();
  20.                     _renderStageRight->setColorMask(leftColorMask);
  21.                 }
  22.                
  23.                 // red
  24.                 leftColorMask->setMask(true,false,false,true);

  25.                 // orange
  26.                 // leftColorMask->setMask(true,true,false,true);

  27.                 _localStateSet->setAttribute(leftColorMask);

  28.                 // draw left eye.
  29.                 _renderStageLeft->draw(_renderInfo,previous);
  30.                
  31.                

  32.                 // ensure that right eye color planes are active.
  33.                 osg::ColorMask* rightColorMask = _renderStageLeft->getColorMask();
  34.                 if (!rightColorMask)
  35.                 {
  36.                     rightColorMask = new osg::ColorMask();
  37.                     _renderStageRight->setColorMask(rightColorMask);
  38.                 }

  39.                 // cyan
  40.                 rightColorMask->setMask(false,true,true,true);
  41.                
  42.                 // blue
  43.                 // rightColorMask->setMask(false,false,true,true);

  44.                 _localStateSet->setAttribute(rightColorMask);
  45.                 _renderStageRight->setColorMask(rightColorMask);

  46.                 // draw right eye.
  47.                 _renderStageRight->draw(_renderInfo,previous);

  48.             }
  49.             break;
复制代码

可见 主要的原理是:
glDrawBuffer(GL_BACK_LEFT);
glReadBuffer(GL_BACK_LEFT);
glColorMask(true,false,false,true);
//绘制场景
DrawScene();
glDrawBuffer(GL_BACK_RIGHT);
glReadBuffer(GL_BACK_RIGHT);
glColorMask(false,true,true,true);
//绘制场景
DrawScene();

//交换前后缓冲
SwapBuffers();

个人的愚见,抛砖引玉,仅供参考。
追求卓越
tan_dunming 评论于2009-5-8 19:36:48
后来在网上搜索到的代码(http://seecool811120.spaces.live ... D43035FA3!183.entry) 这个更完整一点 没有测试过 你可以试一试
2007年2月
3D Stereo OpenGL
搞了几天,搞出来了,原来根本不难啊。只是要定义眼睛的位置和透光的颜色,就可以了。爽。在戴上兰红眼镜就可以看到3D的效果了。眼睛的距离决定了质量。
// linkes Auge

glMatrixMode(GL_PROJECTION);

  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

  glColorMask(TRUE,FALSE,FALSE,TRUE); //rot

  glTranslatef(dAugenabstand/2, 0, 0);

glMatrixMode(GL_MODELVIEW);

DrawScene();

// rechtes Auge

glMatrixMode(GL_PROJECTION);

  glClear(GL_DEPTH_BUFFER_BIT);

  glColorMask(FALSE,TRUE,TRUE,TRUE);

glTranslatef(-dAugenabstand/2, 0, 0);

glMatrixMode(GL_MODELVIEW);

glLoadIdentity();

DrawScene();
追求卓越

手机版|VR开发网 统计 津ICP备18009691号
网安备12019202000257

GMT+8, 2022-1-27 11:29 PM

返回顶部