Qt+OpenGL做的蕾达显示程序[含源代码]

用途:

工作中辅助终端调试的。


特点:
  1. 插件架构:类似于Qt Creator。
  2. 采用OpenGL的FBO和顶点、片段着色器特性实现了雷达余晖效果,PPI视图可以实现每秒渲染数十万点,不到3% cpu占用率。
  3. 基于Qt5与Qt3D,使用QGraphicsItem包装OpenGL绘制的图元,与2D的文字,坐标轴放到一个graphics scene。
  4. model/view的性能优化:model记录更改,每隔一段时间通知view。


截图:

Qt+OpenGL做的蕾达显示程序[含源代码]_第1张图片


代码:
 daviz.zip (302 K) 下载次数:1817 

比较 有趣与大家分享。



1、在qt-project.org上下载Qt 5.0.2。
2、安装QT5.0.2
3、下载一个PortableGit工具,用于下载QT3D
4、在PortableGit目录下打开git-bash.bat
5、git clone git://gitorious.org/qt/qt3d.git qt3d 下载QT3D
6、下载Perl,不然编译QT3D缺少perl.exe。
7、下载地址http://strawberry-perl.googlecode.com/files/strawberry-perl-5.16.3.1-64bit.msi
8、 将QT3D放入无中文件的目录中。
9、打开QT命令窗口,进入QT3D目录。
10、设置环境变量,在命令窗口中输入set PATH=C:\Qt\Strawberry\perl\bin;C:\Qt\Qt5.0.2\5.0.2\mingw47_32\bin;C:\Qt\Qt5.0.2\Tools\MinGW\bin
11、qmake qt3d.pro
12、mingw32-make(QT5没有make命令,如果需要,自己可以加)
13、mingw32-make install


额,实现PPI余晖是采用片断着色器,就在 plugins/ppiview/ppieffect.frag

复制代码
  1. uniform sampler2D qt_Texture0;
  2. varying vec4 qt_TexCoord0;
  3. uniform float specialSector;
  4. uniform float cycle;
  5. uniform float decayFactor;
  6. uniform float antennaPosition;
  7. varying vec4 vertexPosition;
  8. uniform mat4 qt_ModelViewProjectionMatrix;
  9. uniform vec2 coordCenter;
  10. void main(void)
  11. {
  12.     float angle;
  13.     float diff;
  14.     float r;
  15.     vec2 pos;
  16.     pos.x =  qt_TexCoord0.s * 2.0 - 1.0;
  17.     pos.y = -qt_TexCoord0.t * 2.0 + 1.0;
  18.     pos -= coordCenter;
  19.     r = sqrt(pos.x*pos.x + pos.y * pos.y);
  20.     if (pos.x >= 0.0) {
  21.         if (pos.y > 0.0)
  22.             angle = degrees(asin(pos.x/r));
  23.         else
  24.             angle = 180.0 - degrees(asin(pos.x/r));
  25.     } else {
  26.         if (pos.y > 0.0)
  27.             angle = 360.0 - degrees(asin(-pos.x/r));
  28.         else
  29.             angle = 180.0 + degrees(asin(-pos.x/r));
  30.     }
  31.     if (angle <= antennaPosition)
  32.         diff = antennaPosition-angle;
  33.     else
  34.         diff = 360.0-(angle-antennaPosition);
  35.     if (specialSector * 30.0 <= angle && angle < (specialSector + 1.0) * 30.0 && diff > 180.0)
  36.         diff -= 360.0;
  37.     diff += cycle * 360.0;
  38.     vec4 color = texture2D(qt_Texture0, qt_TexCoord0.st);
  39.     float mixed = 1.0 - 4.0 * exp(-diff/decayFactor);
  40.     if (mixed < 0.0)
  41.         mixed = 0.0;
  42.     gl_FragColor = mix(color, vec4(0.0,0.0,0.0,0.0), mixed);
  43. }



FROM: http://www.qtcn.org/bbs/read-htm-tid-51275.html


你可能感兴趣的:(OpenGL)