查看: 2021|回复: 12

OSG中嵌入openGL代码成功,但是如何绑定贴图?

[复制链接]

该用户从未签到

发表于 2013-1-4 15:09:15 | 显示全部楼层 |阅读模式
  之前用qt写了一个opengl的东西程序,程序是继承的qt的qglwidget,用上了OSG后就想能不能直接把那个继承的qglwidget类拿过来用,现在已经在public osg:rawable::DrawCallback的继承类中实现了移植,但是移植后贴图不知道怎么搞了,使用     glGenTextures(GLsizei n, GLint* textureNames);   void glBindTexture(GLenum target, GLuint textureName);
  无法绑定贴图,首先glGenTextures就不能返回一个有效的贴图空间id,所以贴图都成白色的方块,若直接全部改成osg的代码,那我就搞麻烦了,那么我现在怎样才能在osg嵌入opengl代码里面使用贴图呢?

该用户从未签到

发表于 2013-1-5 09:01:45 | 显示全部楼层
就在Drawable的drawaImplementation中实现啊,所有的opengl操作都要在gc makeCurrent 之后才行

该用户从未签到

 楼主| 发表于 2013-1-5 11:39:50 | 显示全部楼层
好的,谢谢! 把加载图片放到drawaImplementation里面glGenTextures就能申请到可用的贴图空间了,现在我想知道图像的长和宽怎么获取啊? 使用 osg ::Texture2D的setImage osgDBA::readImageFile 加载了一张图片, 使用getTextureWidth(), getTextureHeight() 都不正确···

该用户从未签到

发表于 2013-1-5 12:11:53 | 显示全部楼层
读取Image的时候 就获得width和height就行了

该用户从未签到

 楼主| 发表于 2013-1-5 13:06:34 | 显示全部楼层
习惯了获取数据的时候用getXXXX,结果看了半天才发现osg::Image 有的 s(),t(),r()分别返回宽、高、深度·····,还是谢谢“liuzhiyu123” 了!

该用户从未签到

 楼主| 发表于 2013-1-11 19:02:08 | 显示全部楼层
又有个不会的了,我在opengl程序里面做了一些模版测试实现了一些特殊的显示,现在我在Drawable的drawaImplementation进行模版测试没成功

该用户从未签到

 楼主| 发表于 2013-1-11 19:04:54 | 显示全部楼层
模板测试流程
  1.                 glEnable(GL_STENCIL_TEST);                                         
  2.                   glClearStencil(0);                                                                 
  3.                 glClear(GL_STENCIL_BUFFER_BIT);                                 
  4.                 glStencilFunc(GL_ALWAYS, 1, 0xFF);                       
  5.                 glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);                    
  6.                 /************************************************************************/
  7.         //        绘制始终通过的模板测试的图形,使之模版值为1
  8.                 /************************************************************************/
  9.                 glStencilFunc(GL_NOTEQUAL, 1, 1);
  10.                 glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
  11.        // 和模板值为1的图形进行模板测试比较
  12.                 glDisable(GL_STENCIL_TEST);
复制代码
我在opengl里面进行这个操作时出来效果的,但是在drawaImplementation没成功,我把进行模板测试的那一段代码单独放在drawaImplementation也没成功,不晓得怎么回事儿了,求教啊

该用户从未签到

发表于 2013-1-12 16:19:35 | 显示全部楼层
不要试图在osgViewer::Viewer::realize()函数调用之前调用任何的OpenGL API ,它们的调用都将失败,因为在osgViewer::Viewer::realize()函数调用之前,OSG的GraphicsWindows对象都没有建立起来。

该用户从未签到

发表于 2013-1-14 08:10:56 | 显示全部楼层
如果模板操作没有错,在最开始执行一下state的disableAllVertexArrays 然后在进行操作,试试

该用户从未签到

 楼主| 发表于 2013-1-17 17:07:05 | 显示全部楼层
模版测试代码没错,再次放在opengl里面测试是没问题的,
  1.         glEnable(GL_STENCIL_TEST);                                         
  2.         glClearStencil(0);                                                                 
  3.         glClear(GL_STENCIL_BUFFER_BIT);                                 
  4.         glStencilFunc(GL_ALWAYS, 1, 0xFF);                       
  5.         glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);                    
  6.         /************************************************************************/
  7.         //
  8.         glLoadIdentity();
  9.         glColor4d(0.0f,0.5f,0.0f,0.0f);
  10.         glBegin(GL_POLYGON);
  11.         glVertex3d(-300.0,-300.0,0.0);
  12.         glVertex3d(300.0,-300.0,0.0);
  13.         glVertex3d(300.0,300.0,0.0);
  14.         glVertex3d(-300.0,300.0,0.0);
  15.         glEnd();
  16.         /************************************************************************/
  17.         glStencilFunc(GL_NOTEQUAL, 1, 1);
  18.         glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
  19.         // 和模板值为1的图形进行模板测试比较
  20.         glLoadIdentity();
  21.         glColor4d(0.5f,0.0f,0.0f,0.25f);
  22.         glLineWidth(10.0);
  23.         glBegin(GL_LINES);
  24.         glVertex3d(0.0,600.0,0.0);
  25.         glVertex3d(0.0,-600.0,0.0);
  26.         glEnd();

  27.         glDisable(GL_STENCIL_TEST);
复制代码
在virtual void drawImplementation内
  1. virtual void drawImplementation(osg::RenderInfo& renderInfo,const osg::Drawable* drawable) const
  2.         {      
  3.                 osg::State& state = *renderInfo.getState();
  4.                 state.disableAllVertexArrays();

  5.                 glEnable(GL_STENCIL_TEST);                                         
  6.                   glClearStencil(0);                                                                 
  7.                 glClear(GL_STENCIL_BUFFER_BIT);                                 
  8.                 glStencilFunc(GL_ALWAYS, 1, 0xFF);                       
  9.                 glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);                    
  10.                 /************************************************************************/
  11.                 glLoadIdentity();
  12.                 glColor4d(0.0f,0.5f,0.0f,0.0f);
  13.                 glBegin(GL_POLYGON);
  14.                 glVertex3d(-300.0,-300.0,0.0);
  15.                 glVertex3d(300.0,-300.0,0.0);
  16.                 glVertex3d(300.0,300.0,0.0);
  17.                 glVertex3d(-300.0,300.0,0.0);
  18.                 glEnd();
  19.                 /************************************************************************/
  20.                 glStencilFunc(GL_EQUAL, 1, 1);
  21.                 glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
  22.        // 和模板值为1的图形进行模板测试比较
  23.                 glLoadIdentity();
  24.                 glColor4d(0.5f,0.0f,0.0f,0.25f);
  25.                 glLineWidth(10.0);
  26.                 glBegin(GL_LINES);
  27.                 glVertex3d(0.0,600.0,0.0);
  28.                 glVertex3d(0.0,-600.0,0.0);
  29.                 glEnd();

  30.                 glDisable(GL_STENCIL_TEST);
  31.         }
复制代码
测试不通过啊,加了disableAllVertexArrays 也不成功。
这个是自己业余大的事件在改,所以也没及时问!

该用户从未签到

 楼主| 发表于 2013-1-22 10:19:18 | 显示全部楼层
:Q

该用户从未签到

发表于 2013-1-22 13:23:14 | 显示全部楼层
您是否开启了窗口本身的Stencil Buffer?可以在DisplaySettings里面设置stencil位数,也可以在traits->stencil设置

该用户从未签到

 楼主| 发表于 2013-1-25 10:49:58 | 显示全部楼层
按照array的提示,在viewer的主相机里面设置traits->stencil = 1 ,后模版测试成功,谢谢array!:P:P
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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