查看: 1182|回复: 0

RTT纹理问题

[复制链接]

该用户从未签到

发表于 2015-2-6 15:43:43 | 显示全部楼层 |阅读模式
本帖最后由 bigdudu 于 2015-2-6 17:43 编辑

大神们帮我看个问题
"        vec3 exitPoint = texture(backfaceTexture, gl_FragCoord.xy/800.0).xyz;\n"
"        if(abs(exitPoint.x-0.5)<=0.002) exitPoint = vec3(0.0,0.0,0.0);\n"
"fragData = vec4(exitPoint,1.0);\n"
我片元里面这么写,画的立方体上就有一条黑色。。但是我把那个0.002改成0.0019,那条黑色就没有了

这个精度是多少啊


  1. #include <osg/MatrixTransform>
  2. #include <osg/Geometry>
  3. #include <osg/Geode>
  4. #include <osgViewer/Viewer>
  5. #include <osgUtil/SmoothingVisitor>
  6. #include <osg/CullFace>
  7. #include <osgGA/TrackballManipulator>
  8. #include <osg/Texture2D>

  9. char volume_backface_vert[] = "#version 450\n"
  10. "uniform mat4 osg_ModelViewProjectionMatrix;\n"
  11. "uniform mat3 osg_NormalMatrix;\n"
  12. "in vec3 osg_Vertex;\n"
  13. "in vec4 osg_Color;\n"
  14. "in vec3 osg_Normal;\n"
  15. "in vec4 osg_MultiTexCoord0; \n"
  16. "out vec4 color;\n"
  17. "\n"
  18. "void main(void)\n"
  19. "{\n"
  20. "color = osg_Color;\n"
  21. "gl_Position = osg_ModelViewProjectionMatrix * vec4(osg_Vertex, 1.0);\n"
  22. "}\n"
  23. "\n";

  24. char volume_backface_frag[] =
  25. "#version 450\n"
  26. //"uniform sampler3D baseTexture;\n"
  27. "in vec4 color;\n"
  28. "out vec4 fragData;\n"
  29. "void main(void)\n"
  30. "{ \n"
  31. "    fragData = color;\n"
  32. "}\n"
  33. "\n";


  34. char volume_rendering_vert[] = "#version 450\n"
  35. "uniform mat4 osg_ModelViewProjectionMatrix;\n"
  36. "uniform mat4 oag_ModelViewMatrix;\n"
  37. "uniform mat3 osg_NormalMatrix;\n"
  38. "in vec3 osg_Vertex;\n"
  39. "in vec4 osg_Color;\n"
  40. "in vec3 osg_Normal;\n"
  41. "in vec4 osg_MultiTexCoord0; \n"
  42. "out vec3 entryPoint;\n"
  43. "out vec4 ldir0;\n"
  44. "\n"
  45. "void main(void)\n"
  46. "{\n"
  47. "ldir0 = (osg_ModelViewProjectionMatrix)*vec4(0.0,10.0,0.01,0.0);\n"
  48. "entryPoint = osg_Color.xyz;\n"
  49. "gl_Position = vec4(osg_Vertex, 1.0);\n"

  50. "}\n"
  51. "\n";

  52. char volume_rendering_frag[] =
  53. "#version 450\n"
  54. "highp uniform sampler2D backfaceTexture;\n"
  55. "uniform sampler2D frantfaceTexture;\n"

  56. "in vec3 entryPoint;\n"
  57. "out vec4 fragData;\n"


  58. "void main(void)\n"
  59. "{ \n"
  60. "         vec3 exitPoint = texture(backfaceTexture, gl_FragCoord.xy/800.0).xyz;\n"
  61. "        if(abs(exitPoint.x-0.5)<=0.002) exitPoint = vec3(0.0,0.0,0.0);\n"
  62. "fragData = vec4(exitPoint,1.0);\n"

  63. "return;\n"

  64. "}\n"
  65. "\n";


  66. int main()
  67. {

  68.         osg::ref_ptr<osg::Geode> geode = new osg::Geode;


  69.         {
  70.                 osg::Geometry* geom = new osg::Geometry;

  71.                 osg::Vec3Array* coords = new osg::Vec3Array(8);
  72.                 (*coords)[0] = osg::Vec3d(-1.0, -1.0, -1.0);
  73.                 (*coords)[1] = osg::Vec3d(1.0, -1.0, -1.0);
  74.                 (*coords)[2] = osg::Vec3d(1.0, 1.0, -1.0);
  75.                 (*coords)[3] = osg::Vec3d(-1.0, 1.0, -1.0);
  76.                 (*coords)[4] = osg::Vec3d(-1.0, -1.0, 1.0);
  77.                 (*coords)[5] = osg::Vec3d(1.0, -1.0, 1.0);
  78.                 (*coords)[6] = osg::Vec3d(1.0, 1.0, 1.0);
  79.                 (*coords)[7] = osg::Vec3d(-1.0, 1.0, 1.0);
  80.                 geom->setVertexArray(coords);

  81.                 osg::ref_ptr<osg::Vec3Array> normals = new osg::Vec3Array;
  82.                 normals->push_back(osg::Vec3(0.0f, 1.0f, 0.0f));
  83.                 geom->setNormalArray(normals.get());
  84.                 geom->setNormalBinding(osg::Geometry::BIND_OVERALL);

  85.                 osg::Vec4Array* colours = new osg::Vec4Array(8);
  86.                 //(*colours)[0].set(1.0f, 1.0f, 1.0, 1.0f);
  87.                 (*colours)[0] = osg::Vec4d(0.0f, 0.0f, 0.0f, 1.0f);
  88.                 (*colours)[1] = osg::Vec4d(1.0f, 0.0f, 0.0f, 1.0f);
  89.                 (*colours)[2] = osg::Vec4d(1.0f, 1.0f, 0.0f, 1.0f);
  90.                 (*colours)[3] = osg::Vec4d(0.0f, 1.0f, 0.0f, 1.0f);
  91.                 (*colours)[4] = osg::Vec4d(0.0f, 0.0f, 1.0f, 1.0f);
  92.                 (*colours)[5] = osg::Vec4d(1.0f, 0.0f, 1.0f, 1.0f);
  93.                 (*colours)[6] = osg::Vec4d(1.0f, 1.0f, 1.0f, 1.0f);
  94.                 (*colours)[7] = osg::Vec4d(0.0f, 1.0f, 1.0f, 1.0f);
  95.                 geom->setColorArray(colours, osg::Array::BIND_PER_VERTEX);

  96.                 osg::DrawElementsUShort* drawElements = new osg::DrawElementsUShort(GL_QUADS);
  97.                 // bottom
  98.                 drawElements->push_back(0);
  99.                 drawElements->push_back(1);
  100.                 drawElements->push_back(2);
  101.                 drawElements->push_back(3);

  102.                 // bottom
  103.                 drawElements->push_back(3);
  104.                 drawElements->push_back(2);
  105.                 drawElements->push_back(6);
  106.                 drawElements->push_back(7);

  107.                 // left
  108.                 drawElements->push_back(0);
  109.                 drawElements->push_back(3);
  110.                 drawElements->push_back(7);
  111.                 drawElements->push_back(4);

  112.                 // right
  113.                 drawElements->push_back(5);
  114.                 drawElements->push_back(6);
  115.                 drawElements->push_back(2);
  116.                 drawElements->push_back(1);

  117.                 // front
  118.                 drawElements->push_back(1);
  119.                 drawElements->push_back(0);
  120.                 drawElements->push_back(4);
  121.                 drawElements->push_back(5);

  122.                 // top
  123.                 drawElements->push_back(7);
  124.                 drawElements->push_back(6);
  125.                 drawElements->push_back(5);
  126.                 drawElements->push_back(4);

  127.                 geom->addPrimitiveSet(drawElements);
  128.                 osgUtil::SmoothingVisitor::smooth(*geom);


  129.                 osg::ref_ptr<osg::Geode> root = new osg::Geode;
  130.                 osg::StateSet* stateset = root->getOrCreateStateSet();
  131.                 osg::ref_ptr<osg::CullFace> cullFace = new osg::CullFace(osg::CullFace::BACK);
  132.                 stateset->setAttributeAndModes(cullFace.get(), osg::StateAttribute::ON);
  133.                 stateset->setMode(GL_LIGHTING, osg::StateAttribute::OFF);

  134.                 osg::Program* program = new osg::Program;
  135.                 // get shaders from source

  136.                 program->addShader(new osg::Shader(osg::Shader::VERTEX, volume_backface_vert));
  137.                 program->addShader(new osg::Shader(osg::Shader::FRAGMENT, volume_backface_frag));
  138.                 //program->setParameter(GL_GEOMETRY_VERTICES_OUT_EXT, 36 );
  139.                 program->setParameter(GL_GEOMETRY_INPUT_TYPE_EXT, GL_LINES_ADJACENCY_EXT);
  140.                 program->setParameter(GL_GEOMETRY_OUTPUT_TYPE_EXT, GL_LINE_STRIP);
  141.                 stateset->setAttributeAndModes(program, osg::StateAttribute::ON);


  142.                 root->addDrawable(geom);


  143.                 osg::ref_ptr<osg::Texture2D> _backfacetexture;
  144.                 osg::ref_ptr<osg::Camera> _rttbackcamera;
  145.                 osg::ref_ptr<osg::MatrixTransform> rtttransform;


  146.                 int tex_width = 800, tex_height = 800;
  147.                 _backfacetexture = new osg::Texture2D;
  148.                 _backfacetexture->setTextureSize(tex_width, tex_height);
  149.                 _backfacetexture->setInternalFormat(GL_RGBA);
  150.                 _backfacetexture->setResizeNonPowerOfTwoHint(false);
  151.                 _backfacetexture->setFilter(osg::Texture2D::MIN_FILTER, osg::Texture2D::LINEAR);
  152.                 _backfacetexture->setFilter(osg::Texture2D::MAG_FILTER, osg::Texture2D::LINEAR);
  153.                 //_backfacetexture->setWrap(osg::Texture3D::WRAP_R, osg::Texture3D::CLAMP_TO_BORDER);
  154.                 _backfacetexture->setWrap(osg::Texture2D::WRAP_S, osg::Texture2D::REPEAT);
  155.                 _backfacetexture->setWrap(osg::Texture2D::WRAP_T, osg::Texture2D::REPEAT);

  156.                 _rttbackcamera = new osg::Camera;
  157.                 //_rttbackcamera->setViewport(_camera->getViewport());
  158.                 _rttbackcamera->setClearColor(osg::Vec4(1.0f, 1.0f, 1.0f, 0.0f));
  159.                 _rttbackcamera->setClearMask(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  160.                 _rttbackcamera->setRenderOrder(osg::Camera::PRE_RENDER);
  161.                 _rttbackcamera->setRenderTargetImplementation(osg::Camera::FRAME_BUFFER_OBJECT);
  162.                 _rttbackcamera->attach(osg::Camera::COLOR_BUFFER, _backfacetexture.get());


  163.                 rtttransform = new osg::MatrixTransform;
  164.                 rtttransform->addChild(root.get());

  165.                 _rttbackcamera->addChild(rtttransform.get());
  166.                 //_transform->addChild(_rttbackcamera.get());



  167.                 osg::ref_ptr<osg::Group> gp = new osg::Group;
  168.                 gp->addChild(_rttbackcamera);



  169.                         osg::Geometry* geom1 = new osg::Geometry;
  170.                         {
  171.                                
  172.                                 const float w = 2.0 / 2.0f;
  173.                                 const float h = 2.0 / 2.0f;

  174.                                 osg::Vec3Array* vertices = new osg::Vec3Array;
  175.                                 vertices->push_back(osg::Vec3(-w, -h, 0.0f));
  176.                                 vertices->push_back(osg::Vec3(+w, -h, 0.0f));
  177.                                 vertices->push_back(osg::Vec3(-w, +h, 0.0f));
  178.                                 vertices->push_back(osg::Vec3(+w, +h, 0.0f));

  179.                                 osg::Vec3Array* normals = new osg::Vec3Array;
  180.                                 normals->push_back(osg::Vec3(0.0f, 1.0f, 0.0f));


  181.                                 osg::Vec2Array* texCoords = new osg::Vec2Array;
  182.                                 texCoords->push_back(osg::Vec2(0.0f, 0.0f));
  183.                                 texCoords->push_back(osg::Vec2(1.0f, 0.0f));
  184.                                 texCoords->push_back(osg::Vec2(0.0f, 1.0f));
  185.                                 texCoords->push_back(osg::Vec2(1.0f, 1.0f));

  186.                                 osg::ref_ptr<osg::Vec4Array> colors = new osg::Vec4Array;
  187.                                 colors->push_back(osg::Vec4(1.0f, 1.0f, 0.0f, 0.5f));

  188.                                 geom1->setVertexArray(vertices);
  189.                                 geom1->setColorArray(colors.get());
  190.                                 geom1->setColorBinding(osg::Geometry::BIND_OVERALL);
  191.                                 geom1->setTexCoordArray(0, texCoords);
  192.                                 geom1->setNormalArray(normals);
  193.                                 geom1->setNormalBinding(osg::Geometry::BIND_OVERALL);

  194.                                 geom1->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::TRIANGLE_STRIP, 0, vertices->size()));
  195.                                 //geometry->setUseDisplayList(false);
  196.                                 geom1->setUseVertexBufferObjects(true);
  197.                         }
  198.                         geode->addDrawable(geom1);
  199.                         osg::StateSet* stateset1 = geode->getOrCreateStateSet();
  200.                         stateset1->setTextureAttributeAndModes(1, _backfacetexture, osg::StateAttribute::ON);
  201.                         osg::Uniform* backfaceTextureSampler = new osg::Uniform("backfaceTexture", 1);
  202.                         stateset1->addUniform(backfaceTextureSampler);



  203.                         ////----------------------------program------------------------------/////
  204.                         osg::Program* program1 = new osg::Program;
  205.                         // get shaders from source

  206.                         program1->addShader(new osg::Shader(osg::Shader::VERTEX, volume_rendering_vert));
  207.                         program1->addShader(new osg::Shader(osg::Shader::FRAGMENT, volume_rendering_frag));
  208.                         //program->setParameter(GL_GEOMETRY_VERTICES_OUT_EXT, 36 );
  209.                         program1->setParameter(GL_GEOMETRY_INPUT_TYPE_EXT, GL_LINES_ADJACENCY_EXT);
  210.                         program1->setParameter(GL_GEOMETRY_OUTPUT_TYPE_EXT, GL_LINE_STRIP);

  211.                         stateset1->setAttributeAndModes(program1, osg::StateAttribute::ON);


  212.                         gp->addChild(geode.get());
  213.                
  214.                         osgViewer::Viewer viewer;
  215.                         viewer.setCameraManipulator(new osgGA::TrackballManipulator);
  216.                         viewer.setSceneData(gp.get());
  217.                         viewer.setUpViewInWindow((800 - 700) / 2, (800 - 700) / 2, 800, 800);
  218.                         viewer.realize();
  219.                
  220.                         osg::State* state = viewer.getCamera()->getGraphicsContext()->getState();
  221.                         state->setUseModelViewAndProjectionUniforms(true);
  222.                         state->setUseVertexAttributeAliasing(true);
  223.                 return viewer.run();
  224.         }
  225. }
复制代码
QQ图片20150206154237.png
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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