查看: 1659|回复: 0

render to Texture3D

[复制链接]

该用户从未签到

发表于 2013-12-6 16:02:28 | 显示全部楼层 |阅读模式
最近学习一下渲染到3D纹理,创建一个256*256深度为32的3D纹理如下
  1.                 osg::Texture3D* _texture = new osg::Texture3D;
  2.                 _texture->setTextureSize(256,256,32);
  3.                 _texture->setFilter(osg::Texture::MIN_FILTER,osg::Texture::LINEAR);
  4.                 _texture->setFilter(osg::Texture::MAG_FILTER,osg::Texture::LINEAR);
  5.                 _texture->setWrap(osg::Texture::WRAP_S,osg::Texture::CLAMP_TO_EDGE);
  6.                 _texture->setWrap(osg::Texture::WRAP_T,osg::Texture::CLAMP_TO_EDGE);
  7.                 _texture->setWrap(osg::Texture::WRAP_R,osg::Texture::CLAMP_TO_EDGE);
  8.                 _texture->setInternalFormat(GL_RGB16F_ARB);
  9.                 _texture->setSourceFormat (GL_RGB);
  10.                 _texture->setSourceType(GL_FLOAT);
  11.                
复制代码

创建一个平面pannel_1节点,一个2D的rtt相机cameraRtt,

场景根节点下面添加cameraRtt,cameraRtt下面添加pannel_1,cameraRtt始终(0,0,1)看(0,0,0)方向(0,1,0),pannel_1添加shader,使用geometry shader

  1. shader = osg::Shader::readShaderFile(osg::Shader::GEOMETRY,filePath);
  2.         pro->addShader(shader);       
  3.         pro->setParameter( GL_GEOMETRY_VERTICES_OUT_EXT, 3 );
  4.         pro->setParameter( GL_GEOMETRY_INPUT_TYPE_EXT, GL_TRIANGLES );
  5.         pro->setParameter( GL_GEOMETRY_OUTPUT_TYPE_EXT, GL_TRIANGLE_STRIP );
复制代码

cameraRtt渲染到纹理,

  1. m_cameraRtt->attach(osg::Camera::COLOR_BUFFER0,m_RttTexture3D.get(),0,m_cameraRtt->FACE_CONTROLLED_BY_GEOMETRY_SHADER);
  2. m_cameraRtt->setRenderTargetImplementation(osg::Camera::FRAME_BUFFER_OBJECT);
复制代码

在shader中传入layer对层更新,
  1.                        
  2. osg::StateSet *state =  pannel_1->getOrCreateStateSet();
  3. #if 1
  4.                         {
  5.                                 state->getOrCreateUniform("layer",osg::Uniform::INT)->set( m_layer);
  6.                                 ++m_layer;
  7.                                 if (m_layer==32)
  8.                                 {
  9.                                         m_layer = 0;
  10.                                 }
  11.                         }
  12. #else
  13.                         for (int layer = 0; layer < 32; ++layer)
  14.                         {
  15.                                 state->getOrCreateUniform("layer",osg::Uniform::INT)->set( m_layer);
  16.                         }
  17. #endif
复制代码

这里我也不太清楚是一更新设置一下layer还是一次更新设置多次设置layer的值,
vertex shader如下:
  1. void main()
  2. {
  3.         gl_Position = ftransform();
  4.         gl_TexCoord[0] = gl_MultiTexCoord0;
  5.         gl_FrontColor = gl_Color;
  6. }
复制代码

frag shader如下:
  1. uniform sampler2D uTexture2D0;
  2. void main()
  3. {
  4.         vec4   color  = texture2D(uTexture2D0,gl_TexCoord[0]);
  5.         gl_FragData[0] = color;
  6. }

复制代码

geometry   shader如下:
  1. #version 120
  2. uniform int layer;
  3. #extension GL_EXT_geometry_shader4 : enable
  4. void main()
  5. {
  6.         for(int i =0  ; i < gl_VerticesIn ; ++i)
  7.         {
  8.                 gl_Position = gl_PositionIn[i];
  9.                  gl_TexCoord[0] = gl_TexCoordIn[i][0];
  10.                 gl_Layer = layer;
  11.                 EmitVertex();
  12.         }
  13.         EndPrimitive();
  14. }
复制代码


在主相机下面添加一个面板pannel_2 设置纹理为 Texture3D,使用shader传入layer 通过gl_TexCoord[0].z = (layer)/32.0 来获取纹理,最后发现只有pannel_2的layer=0.0时才有纹理。
想要实现rtt 到Texture3D,通过geometry shader的gl_Layer改变图层,然后在贴到平面上显示,结果并未如愿,不知道哪里有问题,谁会这个帮忙指导一下啊!

看了一下osg源码,源码中camera里貌似是一下过程
  1. void Camera::attach(BufferComponent buffer, osg::Texture* texture, unsigned int level, unsigned int face, bool mipMapGeneration,
  2.                     unsigned int multisampleSamples,
  3.                     unsigned int multisampleColorSamples)
  4. {
  5.     _bufferAttachmentMap[buffer]._texture = texture;
  6.     _bufferAttachmentMap[buffer]._level = level;
  7.     _bufferAttachmentMap[buffer]._face = face;
  8.     _bufferAttachmentMap[buffer]._mipMapGeneration = mipMapGeneration;
  9.     _bufferAttachmentMap[buffer]._multisampleSamples = multisampleSamples;
  10.     _bufferAttachmentMap[buffer]._multisampleColorSamples = multisampleColorSamples;
  11. }
复制代码


把attach对象存入map中,而后在FrameBufferObject中
  1. FrameBufferAttachment::FrameBufferAttachment(Camera::Attachment& attachment)
  2. {
  3. ........
  4. osg::Texture3D* texture3D = dynamic_cast<osg::Texture3D*>(texture);
  5.         if (texture3D)
  6.         {
  7.             _ximpl = new Pimpl(Pimpl::TEXTURE3D, attachment._level);
  8.             _ximpl->textureTarget = texture3D;
  9.             _ximpl->zoffset = attachment._face;
  10.             return;
  11.         }
  12. .............
  13. }
复制代码

  1. FrameBufferAttachment::FrameBufferAttachment(Texture3D* target, unsigned int zoffset, unsigned int level)
  2. {
  3.     _ximpl = new Pimpl(Pimpl::TEXTURE3D, level);
  4.     _ximpl->textureTarget = target;
  5.     _ximpl->zoffset = zoffset;
  6. }
复制代码

  1. void FrameBufferAttachment::attach(State &state, GLenum target, GLenum attachment_point, const FBOExtensions* ext) const
  2. {
  3. ........
  4.   case Pimpl::TEXTURE3D:
  5.         if (_ximpl->zoffset == Camera::FACE_CONTROLLED_BY_GEOMETRY_SHADER)
  6.         {
  7.             if (ext->glFramebufferTexture)
  8.             {
  9.                 ext->glFramebufferTexture(target, attachment_point, tobj->id(), _ximpl->level);
  10.             }
  11.         }
  12.         else
  13.             ext->glFramebufferTexture3D(target, attachment_point, GL_TEXTURE_3D, tobj->id(), _ximpl->level, _ximpl->zoffset);
  14.         break;
  15. ........
  16. }
复制代码



我设置attach应该也没错啊,使用了Camera::FACE_CONTROLLED_BY_GEOMETRY_SHADER,求大神指导并纠正错误·····
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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