查看: 1563|回复: 10

关于纹理投影

[复制链接]

该用户从未签到

发表于 2014-7-10 10:00:05 | 显示全部楼层 |阅读模式
大家好,我通过纹理投影方式给三维模型贴图,代码大体如下:

    /**************************************/
    osg::ref_ptr<osg::Texture2D> texture = new osg::Texture2D;
    texture->setWrap(osg::Texture::WRAP_S, osg::Texture::CLAMP_TO_BORDER);
    texture->setWrap(osg::Texture::WRAP_T, osg::Texture::CLAMP_TO_BORDER);
    texture->setDataVariance(osg::Object:YNAMIC);
    texture->setFilter(osg::Texture2D::MIN_FILTER, osg::Texture2D:INEAR);
    texture->setFilter(osg::Texture2D::MAG_FILTER, osg::Texture2D::LINEAR);
    texture->setBorderColor(osg::Vec4(0.0f, 0.0f, 0.0f, 0.0f));
    texture->setBorderWidth(0);

    osg::ref_ptr<osg::Image> image = osgDB::readImageFile(szImgPath);
    texture->setImage(image);

    osg::ref_ptr<osg::TexGen> texgen = new osg::TexGen;
    texgen->setMode(osg::TexGen::OBJECT_LINEAR);
    texgen->setPlane(osg::TexGen::S, osg:lane(...));
    texgen->setPlane(osg::TexGen::T, osg::Plane(...));

    osg::ref_ptr<osg::TexEnv> texenv = new osg::TexEnv;
    texenv->setMode(osg::TexEnv::DECAL);
    texenv->setColor(osg::Vec4(0.0f, 0.0f, 0.0f, 0.0f));

    // modelGeode:三维模型
    osg::StateSet *stateset = modelGeode->getOrCreateStateSet();
    stateset->setMode(GL_LIGHTING, osg::StateAttribute::OFF);
    stateset->setMode(GL_BLEND, osg::StateAttribute::ON);
    stateset->setMode(GL_DEPTH_TEST, osg::StateAttribute::ON);
    // nTextureIndex:纹理通道序号
    stateset->setTextureMode(nTextureIndex, GL_TEXTURE_GEN_S, osg::StateAttribute::ON);
    stateset->setTextureMode(nTextureIndex, GL_TEXTURE_GEN_T, osg::StateAttribute::ON);
    stateset->setTextureAttributeAndModes(nTextureIndex, texture, osg::StateAttribute::ON);
    stateset->setTextureAttributeAndModes(nTextureIndex, texgen, osg::StateAttribute::ON);
    stateset->setTextureAttribute(nTextureIndex, texenv, osg::StateAttribute::ON);
    /**************************************/

现在的问题是,纹理不仅投影在了我希望它出现的地方,也投影在了模型的背面。我了解了一下,这个问题好像叫做“back projection”,我没有找到解决的方法。在SGI OpenGL教程中有这么一段话,说明了纹理投影方式可能会出现这种情况,但并没有明确给出解决方案 :

请注意,就像观察和投影,纹理投影也不是完全符合光学原理的。除非采用特殊的方法,纹理将会影响到所有的表面----不管是前面的还是后面的(译者注:就是电影机后面也会有电影图象,当然这是不符合光学原理的)。因为没有默认的视见体裁剪(View Volume ),应用程序需要小心的避免不希望出现的投影纹理效果。用户自定义裁剪面(附加裁剪面)有助于更好的控制投影纹理该出现在什么地方。

Please note that like the viewing projections, the texture projection is not really optical. Unless special steps are taken, the texture will affect all surfaces within the projection, both in front and in back of the projection. Since there is no implicit view volume clipping (like there is with the OpenGL viewing pipeline), the application needs to be carefully modeled to avoid undesired texture projections, or user defined clipping planes can be used to control where the projected texture appears.

请教各位高手,用什么办法解决这个问题呢?
先谢谢了!

该用户从未签到

 楼主| 发表于 2014-7-10 15:26:42 | 显示全部楼层
斑竹在吗?
王锐兄在吗?
请赐教,谢谢了!

该用户从未签到

 楼主| 发表于 2014-7-10 16:32:06 | 显示全部楼层
只有shader能搞定么?

该用户从未签到

 楼主| 发表于 2014-7-12 11:46:31 | 显示全部楼层
在shader中通过判断顶点纹理坐标q的符号,可以消除reverse projection,而back projection只能通过判断遮挡关系来处理么?

该用户从未签到

 楼主| 发表于 2014-7-12 12:59:48 | 显示全部楼层
利用深度纹理可以在shader中判断遮挡关系么?

该用户从未签到

 楼主| 发表于 2014-7-12 12:59:52 | 显示全部楼层
利用深度纹理可以在shader中判断遮挡关系么?

该用户从未签到

发表于 2014-7-14 10:46:32 | 显示全部楼层
简单的说不好判断,不过你可以从投影纹理的地方渲染一张深度图,在实际投影纹理坐标计算的时候,通过比较这个深度和转换过来的深度来决定是否投影

该用户从未签到

 楼主| 发表于 2014-7-14 12:54:17 | 显示全部楼层
谢谢版主,我也考虑这种实现方式,不过还没有试验。现在弄不明白的是,“深度纹理”中的“深度”二字,其意义是什么,是世界坐标系中某前景点到eye的距离吗?

该用户从未签到

发表于 2014-7-16 09:24:07 | 显示全部楼层
这个地方你需要用到OpenGL 片段着色器中的一个内置变量
  1. varying bool gl_FrontFacing;
复制代码
它表示当前的片段是处于正面还是处于背而。
  1. if(gl_FrontFacing)
  2. {
  3.     // perform your rendering operation
  4. }
  5. else
  6. {
  7.     // do something else
  8.    discard;
  9. }
复制代码
类似于上面的这段着色器代码有可能对你有帮助。

该用户从未签到

发表于 2014-7-16 09:35:04 | 显示全部楼层
不好意思上面的回答有错误,是我把你的意思理解错了。
其实你可以按照Shadow Mapping的方式来做,把ShadowMapping的第二个Pass的着色器代码稍作调整就OK了。

该用户从未签到

 楼主| 发表于 2014-7-17 10:38:58 | 显示全部楼层
the_mercury 发表于 2014-7-16 09:35
不好意思上面的回答有错误,是我把你的意思理解错了。
其实你可以按照Shadow Mapping的方式来做,把Shadow ...

谢谢,我先学习一下
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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