Osg-OsgShader着色器(Qt5.14.2+osgE3.6.5+win10)-No17-OsgShader
无着色器
有着色器
相关资料:
http://t.zoukankan.com/airduce-p-10032442.html 原文
实例代码:
myFrag.frag
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 uniform sampler2D texUnit0; 2 3 void main(){ 4 //texUnit0由外面调用程序传进来,gl_TexCoord[]输入纹理坐标数组;这句话的意思 从纹理采样器texUnit0中取得纹理坐标对应的纹理像素值。 5 vec4 color = texture2D(texUnit0,gl_TexCoord[0].xy); 6 7 //简单的将这三个颜色值相加。 8 float gcolor = color.r+color.g+color.b; 9 //灰度值输出(gl_FragColor是每个片元着色器必须设置的输出) 10 gl_FragColor = vec4(gcolor,gcolor,gcolor,color.a); 11 }
.pro
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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
main.cpp
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <osgViewer/Viewer> 2 3 #include <osg/Node> 4 #include <osg/Geode> 5 #include <osg/Group> 6 #include <osg/ShapeDrawable> 7 8 #include <osgDB/ReadFile> 9 #include <osgDB/WriteFile> 10 11 #include <osgUtil/Optimizer> 12 13 //绘制多个预定义的几何体 14 osg::ref_ptr<osg::Geode> createShape() 15 { 16 //创建一个叶节点 17 osg::ref_ptr<osg::Geode> geode = new osg::Geode(); 18 19 //设置半径和高度 20 float radius = 0.8f; 21 float height = 1.0f; 22 23 //创建精细度对象,精细度越高,细分就越多 24 osg::ref_ptr<osg::TessellationHints> hints = new osg::TessellationHints; 25 //设置精细度为0.5f 26 hints->setDetailRatio(0.5f); 27 28 //添加一个球体,第一个参数是预定义几何体对象,第二个是精细度,默认为0 29 geode->addDrawable(new osg::ShapeDrawable(new osg::Sphere(osg::Vec3(0.0f,0.0f,0.0f),radius),hints.get())); 30 //添加一个正方体 31 geode->addDrawable(new osg::ShapeDrawable(new osg::Box(osg::Vec3(2.0f,0.0f,0.0f),2*radius),hints.get())); 32 33 return geode.get() ; 34 } 35 36 int main() 37 { 38 //创建Viewer对象,场景浏览器 39 osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer(); 40 41 osg::ref_ptr<osg::Group> root = new osg::Group(); 42 43 //添加到场景 44 osg::ref_ptr<osg::Group> myGroup = new osg::Group; 45 myGroup->addChild(createShape()); 46 myGroup->getOrCreateStateSet()->setTextureAttribute( 0,new osg::Texture2D(osgDB::readImageFile("D:/Gitee/OsgEarthTestQt/bin/osgWidget/J20.jpg"))); 47 myGroup->getOrCreateStateSet()->setTextureMode(0,GL_TEXTURE_2D,osg::StateAttribute::ON); 48 49 /************************使用片元着色器************************************/ 50 osg::ref_ptr<osg::StateSet> ss = myGroup->getOrCreateStateSet(); 51 52 //new一个属性类,用于添加属性, 53 osg::ref_ptr<osg::Program> texProgram = new osg::Program; 54 55 //new一个片元着色器 56 osg::ref_ptr<osg::Shader> texFragObj = new osg::Shader(osg::Shader::FRAGMENT); 57 58 texFragObj->loadShaderSourceFromFile("D:/Gitee/OsgEarthTestQt/bin/osgWidget/myFrag.frag"); 59 texProgram->addShader(texFragObj); 60 61 //传参 形参是texUnit0 0作为实参 62 osg::ref_ptr<osg::Uniform> texUniform = new osg::Uniform("texUnit0",0); 63 64 ss->setAttributeAndModes(texProgram); 65 ss->addUniform(texUniform); 66 67 root->addChild(myGroup.get()); 68 /************************使用片元着色器************************************/ 69 //优化场景数据 70 osgUtil::Optimizer optimizer ; 71 optimizer.optimize(root.get()) ; 72 73 viewer->setSceneData(root.get()); 74 viewer->setUpViewInWindow(20,20,600,600); 75 76 viewer->realize(); 77 78 viewer->run(); 79 80 return 0 ; 81 }
作者:疯狂Delphi
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
欢迎关注我,一起进步!扫描下方二维码即可加我
![](https://images.cnblogs.com/cnblogs_com/FKdelphi/1101510/o_200417075318%E5%8A%A0%E6%88%91QQ.jpg)
![](https://images.cnblogs.com/cnblogs_com/FKdelphi/1101510/o_200417080925%E5%8A%A0%E6%88%91%E5%BE%AE%E4%BF%A1.jpg)