お気楽オーディオキット資料館 3479322


グラフィックの基本はOpenGLかな

1:こじはや :

2020/07/08 (Wed) 03:04:24

私は昔からOpenGL(ES)でいろいろ遊んでいます。
WindowsならVisual Studio ExpressでC言語のコンソールアプリならフリーで使えます。私はVS2013EXで止まっています。
箱だけ作ってしまえば、3D表示とか何でもできます。
OpenGLで検索してみてください。
Linux系のX-WindowやAndroidアプリやiPhoneでも使えます。
ただ、文字などのフォント表示は別にライブラリーを入れないと表示できないのでちと不便かな。
3年前くらい前に360度カメラで撮った写真や動画をOpenGLESとOpenCVでスマフォでVR表示させるソフトを作ったりしました。
遊びでやっているので、完成度は適当ですが。(笑い)
2:ヒロ :

2020/07/08 (Wed) 20:11:51

情報ありがとうございます。
OpenGLは聞いたことはあるような、ないような・・。
で、いろいろくぐって、なにやらGLUTなるものが
あって、それをなんとかインストールして
MinGWでコンパイルして、図形がでてきました(笑。
もちろん、サンプルプログラムままで何をしているか
全然わかりませんが・・・・。でも、ちらっとみた
感じではPC98のときのようなソースに似ているような
気もです。
 まだまだ修行が必要なようです。
3:こじはや :

2020/07/08 (Wed) 20:56:13

ここの先生が一番親切な説明があります。
https://tokoik.github.io/opengl/libglut.html
Linuxでのやり方も出ています。
参考にしてください。
4:ヒロ :

2020/07/08 (Wed) 22:03:20

ありがとうございます。
かなり読み応えがあります。
5:ヒロ :

2020/07/09 (Thu) 21:52:59

色々ろライブラリーをインストールして、PasPiとWIN10の両方でGTK+とGLUTが動くようになりました。
で、先にRasPi用にGTK+で作ったソフト(正確には過去にPC98用に作ったソフトを移植したもの)を、Win10でコンパイルして実行です。一応、動くのですが少々、RasPiと勝手が違います。Win10では対象となるWINDOWの外でのマウスクリックに反応(最初の2回程度)してしまう現象がありました。マウス座標の値については、誤動作したときは前回と同じなになるようなので、急場しのぎで同じ座標だったらイベントとしてうけつけないようにしました。おそらく、必要な設定があるのでしょうが、RasPiとWin10で同じソフトが動くようになったのは大きな前進です(ちょっとうれしいです)。

 次はRasPiとWin10間で自由にデータのやり取りができるように調べてみようかと思っています。現時点ではUSBメモリーをつかっていますが、やはり面倒です。あとは、1つのキーボードとマウスで使えるようにです。どうやらこれはVNCをつかうえばいいようなことが書いてありました。動くかな~。
6:ヒロ :

2020/07/09 (Thu) 23:07:10

ファイル共有はWinSCP
画面の乗っ取りはVNC VIEWER
でできました。VNC VIEWERでグラフィックを扱うのはちょっときついですが・・(反応が遅い)。
でも、着々と環境が整いつつあります。
7:こじはや :

2020/07/10 (Fri) 00:09:29

マンデルブロー集合表示を作ってみました。気分転換で遊んでみてください。画面いっぱいにすると綺麗です。
マウスで拡大したい場所を左クリックで拡大し、右クリックで縮小します。8回層くらいで破綻しますが。(笑い)

// マンデルブロー集合表示
// マウスの左ボタンでその位置中心で拡大して描画する。
// 左ボタンで縮小

#include <stdio.h>
#include <GL/glut.h>

int iWidth = 640;
int iHeight = 480;
int W_Size = 640;
const double factor = 4; // 拡大倍率
int NMAX = 100;
double a0 = 0.6, b0 = 0.0, vs = 2.0; // 中心座標(a0, b0) と区間幅 ±vs
double vh = 2.0;

int mandelbrot(double a, double b)
{
double x = 0.0, y = 0.0, x1, y1;

for (int n = 1; n<NMAX; n++){
x1 = x*x - y*y - a;
y1 = 2 * x*y - b;
if (x1*x1 + y1*y1 > 5.0) return n;
x = x1; y = y1;
}

return 0;
}

void display(void)
{

double a, b, d;
glClear(GL_COLOR_BUFFER_BIT);
glLoadIdentity();
glOrtho(a0 - vs, a0 + vs, b0 - vh, b0 + vh, -1.0, 1.0);
glColor3d(1.0, 0.0, 0.0);
glBegin(GL_POINTS);

d = vs / W_Size;

for (int i = -W_Size; i <= W_Size; i++){
a = a0 + d * i;
for (int j = -W_Size; j <= W_Size; j++){
b = b0 + d * j;
int n = mandelbrot(a, b);

if (n) {
double r_d = 0, g_d = 0, b_d = 0;
int cc = NMAX / 3; // 表示色計算 3色に分ける
r_d = (n < cc) ? n * 3 : 0;
g_d = ((n > cc ) && n < (cc * 2)) ? (n-cc) * 3.0 : 0;
b_d = (n > (cc * 2)) ? (n - cc*2) * 3 : 0;

r_d /= NMAX; // 0.0 <-> 1.0 の範囲にする
g_d /= NMAX;
b_d /= NMAX;
glColor3d(r_d, g_d, b_d);
glVertex2d(a, b);
}
}
}

glEnd();
glFlush();

}


void mouse(int button, int state, int x, int y)
{
switch (button) {
case GLUT_LEFT_BUTTON:
if (state == GLUT_DOWN){
a0 = a0 - vs + (vs*2.0*(double)x / (double)iWidth);
b0 = b0 - vh + (vh*2.0*(double)(iHeight - y) / (double)iHeight);
vs /= factor;
vh /= factor;
NMAX = (int)(NMAX * 1.2);
printf("**MOUSE** left x=%d y=%d a0=%f b0=%f vs=%f NMAX=%d \n", x, y, a0, b0, vs, NMAX);
glutPostRedisplay();
}
break;
case GLUT_MIDDLE_BUTTON:
printf("middle");
break;
case GLUT_RIGHT_BUTTON:
if (state == GLUT_DOWN){
a0 = a0 - vs + (vs*2.0*(double)x / (double)iWidth);
b0 = b0 - vh + (vh*2.0*(double)(iHeight - y) / (double)iHeight);
vs *= factor;
vh *= factor;
NMAX = (int)(NMAX / 1.2);
printf("**MOUSE** left x=%d y=%d a0=%f b0=%f vs=%f NMAX=%d \n", x, y, a0, b0, vs, NMAX);
glutPostRedisplay();
}
break;
default:
break;
}
}

void resize(int w, int h)
{
/* ウィンドウ全体をビューポートにする */
glViewport(0, 0, w, h);
iWidth = w;
iHeight = h;
W_Size = iWidth;

/* 変換行列の初期化 */
glLoadIdentity();
/* スクリーン上の座標系をマウスの座標系に一致させる */
printf("**resize ** left iWidth=%d iHeight=%d a0=%f b0=%f vs=%f NMAX=%d \n", iWidth, iHeight, a0, b0, vs, NMAX);
vh = vs * ((double)iHeight / (double)iWidth);
glOrtho(a0 - vs, a0 + vs, b0 - vh, b0 + vh, -1.0, 1.0);

}

void init(void)
{
glClearColor(0.0, 0.0, 1.0, 1.0);
}

int main(int argc, char *argv[])
{
glutInitWindowPosition(50, 50);
glutInitWindowSize(iWidth, iHeight);
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGBA);
glutCreateWindow(argv[0]);
glutDisplayFunc(display);
glutReshapeFunc(resize);
glutMouseFunc(mouse);
init();
glutMainLoop();
return 0;
}
8:こじはや :

2020/07/10 (Fri) 01:41:24

https://bbs6.fc2.com//bbs/img/_410600/410522/full/410522_1594312884.jpg 掲示板を汚してすみません。上記の表示のサンプルです。
フラクタルは奇々怪々です。
9:ヒロ :

2020/07/10 (Fri) 21:05:23

さっそく動かしてみました。
RasPiとWIN10の両方で動きましたが、ちょっとだけ挙動が違いました。
WIN10では、計算過程が逐次描画されていくのに対して、RasPiでは計算終了後に一気に表示されます。
マウスの動作についてはWin10では、1度のクリックでも2度ほど再描画します。

若干の違いはOSの違いなのでしょうね。
10:ヒロ :

2020/07/10 (Fri) 21:22:49

ちなみに実行速度はRsPi(3B+)の方がWin10(Core2QUAD)に比べて倍ほど早いようです。
11:こじはや :

2020/07/10 (Fri) 23:08:36

マウス押下の2回表示はWin10でもPCによって違いがあるようです。家のWin10の2台で違いました。
2回表示される方はmouse関数のglutPostRedisplay();を呼ばないようにしてください。
最初の1発で2回表示されるのはこのタイプのようです。
それと、
#include <time.h>
display()の頭と終わりに、
clock_t t1, t2;
t1 = clock();
。。。。
t2 = clock();
printf("Display Time=%fs\n", (double)(t2 - t1) / CLOCKS_PER_SEC);

を入れてみて時間測定をしてみて下さい。

私の家の2台のPCの一発目の描画時間は
0.328000s Win10 i7 2.7G Intel(R) HD Gr3000 MacBook Pro 2012 Bootcamp
0.223000s Win10 i7 3.5G GeForce GTX 1050
Nvidia TX2 (Ubuntu) は0.575000sでした。
PCのベンチマークテストになりそうですね。
12:ヒロ :

2020/07/11 (Sat) 16:24:46

Display Time=20.397000s
でした。DELL OPTIPLEX780 Core2QUADです。

100倍かかっちゃいますね。
グラフィックボードなしだとこんなもんかな?

RasPi 3B+だと
Display Time=6.029049s
Display Time=5.574782s
でした。PCがだいぶ負けてるな~。
13:こじはや :

2020/07/11 (Sat) 17:14:29

Nvidia TX2をgccで-O2つけてみたら、0.562337→0.421881sになりました。
-O4にしてもこれ以上早くなりませんでした。
NVIDIA Jetson Nanoはコストパフォーマンス高そうです。たぶん1秒はかからないかも。
秋月でも売ってますね。

14:こじはや :

2020/07/11 (Sat) 18:50:10

調べていたらNanoが欲しくなりました。買おうかな、
そしてDeepLearningに再トライするかな。老人のAI挑戦。(笑い)
Tx2では写真から犬と猫を判断するDEMOを動かしたところで止まっています。95%程度は判断できるので、どんな特徴を認識しているのか、摩訶不思議です。
15:ヒロ :

2020/07/11 (Sat) 21:22:26

最適化オプションつけたら
 win10・・・かわりなし。
 RasPi・・・10%高速
程度でした。

>NVIDIA Jetson Nanoはコストパフォーマンス高そうです。
 おもしろそうなものがありますね。ちょっと頭の片隅に・・・(笑。

>どんな特徴を認識しているのか、
 CNNの最大の課題でしょうか。誤認識おこっても詳細な原因がわからなくて、結局学習データが悪いことにされちゃうん(しちゃう?)だろうな~っと。

16:こじはや :

2020/07/12 (Sun) 13:45:09

https://bbs6.fc2.com//bbs/img/_410600/410522/full/410522_1594529110.jpg 少し前の記事ですが、人間が感じる錯覚も深層学習(DeepLearning)でも同じことが起こるとは、人の頭の神経構造に近い学習なのかも。
17:こじはや :

2020/07/13 (Mon) 23:00:38

秋月に自転車で行ってNVIDIA Jetson Nanoを買っちゃいました。

Display Time=0.716836s
Display Time=0.750517s

-O2
Display Time=0.453189s
Display Time=0.486398s

でした。あれ、TX2と同じくらい早い。(笑い)
ご報告まで。

それと、上の錯覚図形と同じような絵を描ける表示ソフトを作ってみます。

オーディオと関係ない話ですみません。

18:ヒロ :

2020/07/14 (Tue) 13:06:45

いえいえ、オーディオは電子・情報技術の上に成り立っていますから歓迎です。私自身も最近オーディオネタでないほうが多いし(汗。
19:ヒロ :

2020/07/23 (Thu) 12:42:05

RasPi4Bが届いたので、コンパイル環境の確認もふくめて
マンデルブローを動かしてみました。3B+に比べると、
かなり早くなったようです(-O2オプション).


RasPi 4B
Display Time=0.665544s
Display Time=0.475520s


RasPi 3B+
Display Time=6.029049s
Display Time=5.574782s
20:こじはや :

2020/07/24 (Fri) 00:40:39

NVIDIA Jetson Nanoと同じくらいの速さですね。
素晴らしいです。RasPi 4Bがそんなに早いとは知らなかったです。
私は今は、Jetson NanoでYOLOを動かしてUSBカメラで映った物体認識させて遊んでいます。
21:ヒロ :

2020/07/24 (Fri) 11:13:30

得て不得手があるようですが、
普通の四則演算中心だと3倍程度の実績でした。

22:こじはや :

2020/08/01 (Sat) 20:03:53

RasPi4からはOpenGL対応したGPU(VideoCore VI)が入っているので早いようです。
マンデルブロー集合表示の動画を作ってみました。
https://youtu.be/JsxOxh0o1uA
23:ヒロ :

2020/08/01 (Sat) 22:53:38

2回目の視聴ゲットしました(笑。

  • 名前: E-mail(省略可):
  • 画像:

Copyright © 1999- FC2, inc All Rights Reserved.