zl程序教程

您现在的位置是:首页 >  系统

当前栏目

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

win10 着色器 OSG
2023-09-14 08:57:11 时间

无着色器

有着色器

 

相关资料:

http://t.zoukankan.com/airduce-p-10032442.html   原文

 

实例代码:

myFrag.frag

 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     }
View Code

.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 #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 }
View Code