在OSGEarth上绘制水效果的思路为:
1. 使用OSG::Geometry的方式绘制多边形;
2. 在绘制的多边形上贴一个水的纹理;
3. 对纹理使用shader效果,使之动态展示。
此种方式适用于小范围的不严格的水效果,若需要大范围或者有水底效果的请使用OSGOcean。
代码如下:water.h
class Water : public HandleAdapter
{
public:
Water(GraphicsView* view);
~Water();
protected:
virtual void slotPickedXYZ(osg::Vec3d pos);
virtual void slotMoveingXYZ(osg::Vec3d pos);
virtual void slotRightHandle();
private:
void drawWater(osg::Vec3d pos = osg::Vec3d());
osg::Texture2D* creatText2D(const QString& strFile);
void initShader();
private:
osg::ref_ptr<osg::Vec3dArray> m_vecPoints;
osg::Geode* m_pWater;
char* m_waterFrag;
char* m_waterVert;
};
实现代码如下:water.cpp
Water::Water(GraphicsView* view)
: HandleAdapter(view)
{
m_pWater = NULL;
m_vecPoints = new osg::Vec3dArray;
m_vecPoints->clear();
initShader();
}
Water::~Water()
{
}
void Water::slotPickedXYZ(osg::Vec3d pos)
{
m_vecPoints->push_back(pos);
if (m_vecPoints->size() <= 2)
{
return;
}
drawWater();
}
void Water::slotMoveingXYZ(osg::Vec3d pos)
{
if (m_vecPoints->size() < 2)
{
return;
}
drawWater(pos);
}
void Water::slotRightHandle()
{
endHandle();
m_pWater = nullptr;
}
void Water::drawWater(osg::Vec3d pos /*= osg::Vec3d()*/)
{