Osg-OsgShader着色器(Qt5.14.2+osgE3.6.5+win10)-No19-OsgShader

.pro

 1 QT       += core gui widgets
 2 TARGET = TestOsgQt
 3 TEMPLATE = app
 4 DEFINES += QT_DEPRECATED_WARNINGS
 5 CONFIG += c++11
 6 
 7 QMAKE_CXXFLAGS_RELEASE = $$QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO
 8 QMAKE_LFLAGS_RELEASE = $$QMAKE_LFLAGS_RELEASE_WITH_DEBUGINFO
 9 
10 SOURCES += \
11         main.cpp
12 
13 HEADERS +=
14 
15 OsgDir = D:\\Gitee\\osg365R
16 CONFIG(release, debug|release) {
17         LIBS += -L$${OsgDir}/lib/ -losgDB -losgViewer -lOpenThreads -losgAnimation -losg \
18                                   -losgEarth -losgEarthAnnotation -losgEarthFeatures -losgEarthSymbology -losgEarthUtil \
19                                   -losgQOpenGL -losgUtil -losgText -losgTerrain -losgSim \
20                                   -losgShadow -losgParticle -losgManipulator -losgGA -losgFX \
21                                   -losgWidget
22 } else {
23         LIBS += -L$${OsgDir}/debug/lib/ -losgDBd -losgViewerd -lOpenThreadsd -losgAnimationd -losgd \
24                                   -losgEarthd -losgEarthAnnotationd -losgEarthFeaturesd -losgEarthSymbologyd -losgEarthUtild \
25                                   -losgQOpenGLd -losgUtild -losgTextd -losgTerraind -losgSimd \
26                                   -losgShadowd -losgParticled -losgManipulatord -losgGAd -losgFXd \
27 }
28 
29 
30 INCLUDEPATH += $${OsgDir}/include
31 DEPENDPATH += $${OsgDir}/include
View Code

main.cpp

  1 // 原文
  2 // https://www.baidu.com/link?url=gbmmOlk8c213ybwxNnnYTwLqvK3vZajPVLLSImrBOG1ovEN1eYnkxoJUkMidHz7efRheoF9g_XQM_Nx5r70hI_&wd=&eqid=b5d5f9fc00012dcf0000000362ce309e
  3 
  4 #include <osg/Node>
  5 #include <osg/Geometry>
  6 #include <osg/Notify>
  7 #include <osg/MatrixTransform>
  8 #include <osg/Texture2D>
  9 #include <osg/DrawPixels>
 10 #include <osg/PolygonOffset>
 11 #include <osg/Geode>
 12 
 13 #include <osgDB/Registry>
 14 #include <osgDB/ReadFile>
 15 
 16 #include <osgText/Text>
 17 
 18 #include <osgViewer/Viewer>
 19 
 20 #include <osg/ShapeDrawable>
 21 
 22 #ifdef _DEBUG
 23 #pragma comment(lib,"osgd.lib")
 24 #pragma comment(lib,"osgDBd.lib")
 25 #pragma comment(lib,"osgTextd.lib")
 26 #pragma comment(lib,"osgViewerd.lib")
 27 #endif
 28 
 29 class TextureCoordUpdateCallback : public osg::NodeCallback
 30 {
 31 public:
 32 
 33     TextureCoordUpdateCallback(double delay = 1.0) :
 34         _delay(delay),
 35         _prevTime(0.0)
 36     {
 37     }
 38 
 39     virtual void operator()(osg::Node* node, osg::NodeVisitor* nv)
 40     {
 41         if (nv->getFrameStamp())
 42         {
 43             double currTime = nv->getFrameStamp()->getSimulationTime();
 44             if (currTime - _prevTime > _delay)
 45             {
 46                 osg::Geode* geode = node->asGeode();
 47                 osg::Geometry* geom = geode->getDrawable(0)->asGeometry();
 48                 // 获取纹理坐标数组
 49                 osg::Array* tmp = geom->getTexCoordArray(0);
 50                 osg::Vec2Array* coorArray = (osg::Vec2Array*) tmp;
 51                 auto it = coorArray->begin();
 52                 for (; it < coorArray->end(); it++)
 53                 {
 54                     // 动起来
 55                     it->x() += 0.001;
 56                 }
 57                 // 更新纹理坐标数组
 58                 geom->setTexCoordArray(0, coorArray);
 59 
 60                 // record time
 61                 _prevTime = currTime;
 62             }
 63         }
 64     }
 65 
 66 
 67 protected:
 68     double                          _delay;
 69     double                          _prevTime;
 70 
 71 };
 72 
 73 
 74 osg::Node* createPyramidModel()
 75 {
 76     // create the root node which will hold the model.
 77     osg::Group* root = new osg::Group();
 78 
 79     // turn off lighting
 80     root->getOrCreateStateSet()->setMode(GL_LIGHTING, osg::StateAttribute::OFF);
 81 
 82     osg::Geode* pyramidGeode = new osg::Geode();
 83     osg::Geometry* pyramidGeometry = new osg::Geometry();
 84     pyramidGeode->setUpdateCallback(new TextureCoordUpdateCallback(0.01));
 85     pyramidGeode->setDataVariance(osg::Object::DYNAMIC);
 86     pyramidGeode->addDrawable(pyramidGeometry);
 87     root->addChild(pyramidGeode);
 88 
 89     osg::Vec3Array* pyramidVertices = new osg::Vec3Array;
 90     pyramidVertices->push_back(osg::Vec3(0, 0, 0)); // 左前
 91     pyramidVertices->push_back(osg::Vec3(10, 0, 0)); // 右前
 92     pyramidVertices->push_back(osg::Vec3(10, 10, 0)); // 右后
 93     pyramidVertices->push_back(osg::Vec3(0, 10, 0)); // 左后
 94     pyramidVertices->push_back(osg::Vec3(5, 5, 10)); // 塔尖
 95     pyramidGeometry->setVertexArray(pyramidVertices);
 96     osg::DrawElementsUInt* pyramidBase = new osg::DrawElementsUInt(osg::PrimitiveSet::QUADS, 0);
 97     pyramidBase->push_back(3);
 98     pyramidBase->push_back(2);
 99     pyramidBase->push_back(1);
100     pyramidBase->push_back(0);
101     pyramidGeometry->addPrimitiveSet(pyramidBase);
102     osg::DrawElementsUInt* pyramidFaceOne = new osg::DrawElementsUInt(osg::PrimitiveSet::TRIANGLES, 0);
103     pyramidFaceOne->push_back(0);
104     pyramidFaceOne->push_back(1);
105     pyramidFaceOne->push_back(4);
106     pyramidGeometry->addPrimitiveSet(pyramidFaceOne);
107     osg::DrawElementsUInt* pyramidFaceTwo = new osg::DrawElementsUInt(osg::PrimitiveSet::TRIANGLES, 0);
108     pyramidFaceTwo->push_back(1);
109     pyramidFaceTwo->push_back(2);
110     pyramidFaceTwo->push_back(4);
111     pyramidGeometry->addPrimitiveSet(pyramidFaceTwo);
112     osg::DrawElementsUInt* pyramidFaceThree = new osg::DrawElementsUInt(osg::PrimitiveSet::TRIANGLES, 0);
113     pyramidFaceThree->push_back(2);
114     pyramidFaceThree->push_back(3);
115     pyramidFaceThree->push_back(4);
116     pyramidGeometry->addPrimitiveSet(pyramidFaceThree);
117     osg::DrawElementsUInt* pyramidFaceFour = new osg::DrawElementsUInt(osg::PrimitiveSet::TRIANGLES, 0);
118     pyramidFaceFour->push_back(3);
119     pyramidFaceFour->push_back(0);
120     pyramidFaceFour->push_back(4);
121     pyramidGeometry->addPrimitiveSet(pyramidFaceFour);
122 
123     osg::Vec4Array* colors = new osg::Vec4Array;
124     colors->push_back(osg::Vec4(1.0f, 0.0f, 0.0f, 1.0f)); //红色
125     colors->push_back(osg::Vec4(0.0f, 1.0f, 0.0f, 1.0f)); //绿色
126     colors->push_back(osg::Vec4(0.0f, 0.0f, 1.0f, 1.0f)); //蓝色
127     colors->push_back(osg::Vec4(1.0f, 1.0f, 1.0f, 1.0f)); //白色
128     pyramidGeometry->setColorArray(colors);
129     pyramidGeometry->setColorBinding(osg::Geometry::BIND_PER_VERTEX);
130 
131     osg::Vec3Array* normals = new osg::Vec3Array(1);
132     (*normals)[0].set(0.0f, -1.0f, 0.0f);
133     pyramidGeometry->setNormalArray(normals, osg::Array::BIND_OVERALL);
134 
135     osg::Vec2Array* texcoords = new osg::Vec2Array(5);
136     (*texcoords)[0].set(0.00f, 0.0f);
137     (*texcoords)[1].set(0.25f, 0.0f);
138     (*texcoords)[2].set(0.50f, 0.0f);
139     (*texcoords)[3].set(0.75f, 0.0f);
140     (*texcoords)[4].set(0.50f, 1.0f);
141     pyramidGeometry->setTexCoordArray(0, texcoords);
142 
143     // set up the texture state.
144     osg::Texture2D* texture = new osg::Texture2D;
145     texture->setDataVariance(osg::Object::DYNAMIC); // protect from being optimized away as static state.
146     texture->setFilter(osg::Texture2D::MIN_FILTER, osg::Texture2D::LINEAR);
147     texture->setFilter(osg::Texture2D::MAG_FILTER, osg::Texture2D::LINEAR);
148     texture->setWrap(osg::Texture2D::WRAP_S, osg::Texture2D::REPEAT);
149     texture->setWrap(osg::Texture2D::WRAP_T, osg::Texture2D::REPEAT);
150     texture->setImage(osgDB::readImageFile("D:/Gitee/OsgTestQt/src/No19-OsgShader/road.png"));
151     osg::StateSet* stateset = pyramidGeometry->getOrCreateStateSet();
152     stateset->setTextureAttributeAndModes(0, texture, osg::StateAttribute::ON);
153 
154     return root;
155 }
156 
157 static const char * fragShader = {
158     "varying vec4 color;\n"
159     "uniform sampler2D baseTex;\n"
160     "uniform int osg_FrameNumber;\n"//当前OSG程序运行的帧数;
161     "uniform float osg_FrameTime;\n"//当前OSG程序的运行总时间;
162     "uniform float osg_DeltaFrameTime;\n"//当前OSG程序运行每帧的间隔时间;
163     "uniform mat4 osg_ViewMatrix;\n"//当前OSG摄像机的观察矩阵;
164     "uniform mat4 osg_ViewMatrixInverse;\n"// 当前OSG摄像机观察矩阵的逆矩阵。
165     "void main(void){\n"
166     "vec2 coord = gl_TexCoord[0].xy+vec2(0,osg_FrameTime*0.8);"
167     "   gl_FragColor = texture2D(baseTex, coord);\n"
168     "}\n"
169 };
170 osg::Node* createCone()
171 {
172     osg::ref_ptr<osg::Geode> geode = new osg::Geode;
173     osg::ref_ptr<osg::Cone> cone = new osg::Cone(osg::Vec3(0, 0, 0), 1.0f, 5);
174     osg::ref_ptr<osg::ShapeDrawable> shapeDrawable = new osg::ShapeDrawable(cone.get());
175     geode->addDrawable(shapeDrawable.get());
176 
177     // set up the texture state.
178     osg::Texture2D* texture = new osg::Texture2D;
179     //texture->setDataVariance(osg::Object::DYNAMIC); // protect from being optimized away as static state.
180     texture->setFilter(osg::Texture2D::MIN_FILTER, osg::Texture2D::LINEAR);
181     texture->setFilter(osg::Texture2D::MAG_FILTER, osg::Texture2D::LINEAR);
182     texture->setWrap(osg::Texture2D::WRAP_S, osg::Texture2D::REPEAT);
183     texture->setWrap(osg::Texture2D::WRAP_T, osg::Texture2D::REPEAT);
184     texture->setImage(osgDB::readImageFile("D:/Gitee/OsgTestQt/src/No19-OsgShader/J20.jpg"));
185 
186     osg::StateSet* stateset = shapeDrawable->getOrCreateStateSet();
187     stateset->setTextureAttributeAndModes(0, texture, osg::StateAttribute::ON);
188     osg::Program * program = new osg::Program;
189     program->addShader(new osg::Shader(osg::Shader::FRAGMENT, fragShader));
190     stateset->addUniform(new osg::Uniform("baseTex", 0));
191     stateset->setAttributeAndModes(program, osg::StateAttribute::ON);
192 
193     return geode.release();
194 }
195 int main(int, char **)
196 {
197     // construct the viewer.
198     osgViewer::Viewer viewer;
199 
200     // add model to viewer.
201     //viewer.setSceneData(createPyramidModel());
202     viewer.setSceneData(createCone());
203     viewer.setUpViewInWindow(200, 200, 800, 600, 0);
204 
205     return viewer.run();
206 }
View Code

 

posted on 2022-07-13 13:17  疯狂delphi  阅读(127)  评论(0编辑  收藏  举报

导航