demoscene.jp Japanese demoscene portal

2312月/120

メガデモプラットフォームとしてのRaspberryPi

こんにちは@sharowです。

今日はRaspberryPi(ラズベリーパイ)を買ってGPIOでLED点灯させてはみたものの、その後使い道があまり思いつかず途方に暮れている人をデモシーンに落とし込む作戦です。まだ知らない人も、これから買う人も、いっしょに罠にかけたいので最初に簡単にRaspberryPiを紹介しておきます。

※食べれません

Price: 35米ドルRaspberryPiとは

CPU: ARMv6 700MHz (ARM11ファミリ、ハードウェア浮動小数点演算対応)
GPU: VideoCore IV (OpenGLES 2.0, OpenVG 1.1, EGL 1.4, HD1080出力)
Memory: 512MB VRAM共有
VideoOut: コンポジット(RCA), HDMI(High-Definition Megademo Interface) 1.3a
AudioOut: 3.5mmジャック, HDMI-Audio
etc: 10/100Mbpsイーサネット, SDHCカードスロット, USB2.0x2
Dimention: だいたい厚み2cmの名刺サイズ、あるいは一回り大きいお餅

The MagPiのIssue 01の最初のページに「The Dawn Of Affordable Computing」と題したエッセイのようなものが載っています。「入手可能コンピュータの夜明け」とでも訳せましょうか。SinclairとCommodore元祖として挙げられているので、それらと比べてみましょう。

  • 1981年 Sinclair ZX81: 当時の価格で99.95ポンド、約150万台出荷
  • 1982年 Commodore 64: 当時の価格で595米ドル、出荷は1250万~1700万台
  • 2012年 RaspberryPi(Model B): 今の価格で35米ドル、公式発表では年内に100万台以上出荷する予定(生産が追いついていない)

さてこれなんですが、基盤むき出しなので一見組み込みに使われてるArduinoみたいなものかと思われそうですが、それとはちょっと異なります(そのような用途にも使えます)。BeagleBoardはちょっと近いかもしれませんが、あちらは89ドル~149ドルの価格帯です。子供でも買える値段で、Linuxが使えてそれ自体でプログラミングができる、それがRaspberryPiの最初のコンセプトなんじゃないかと勝手に想像してます。ゲーム機でもなければビジネスマシンでもありません。そういえば当時のCommodore 64のCMを見ても子供や学習環境をターゲットにしたコンピュータであったことが分かります。RaspberryPiと目的が少し似ているかもしれません。

入手方法

既にこの段階で「買うしかねぇ!」と悟った方のために、先に入手方法を説明しておきます。日本国内で在庫持ってるとこもあるのですが、値段が高いので海外サイトで買うのがお勧めです。まずRaspberryPi自体の生産も請け負ってるRSコンポーネンツですが、今年9月ここで買ったら10週間以上かかりました。近頃はそんなにかからないようです。ModMyPiで買うとケース付きで送料込みで4800円くらいで、早ければ10~14日くらいで届きます。日本から買うならこのどちらかがよいでしょう。

周辺機器が無い場合は別途用意する必要があります。

  • キーボード
  • SDHCカード(2GB以上)
  • microUSBケーブル
  • HDMI/RCA入力のある表示装置
  • 等...

SSH経由で使うのならキーボードなどは必要ありませんし、逆にウィンドウシステムを使うのならマウスが必要、という感じに用途によって異なりますが、いずれにしろSDHCカードと給電するmicroUSBケーブルと電源ソース(USB給電用)だけは必須です。結構ハマるのが電源関連で、RaspberryPiのUSBポート(給電じゃない方)はあまり電源として使えないので、つなげるものによってはセルフパワーのUSBハブが必要です。電流不足になるとSDカードへの書き込みに失敗してファイルシステムが論理破損します(しました)。なので電源ソースは700mAを給電できるものにしましょう。

ちなみに2013年にはRaspberryPiの’Model A'というLANとUSBポート1基を削ったバージョンが$25で本格的に出荷される予定です。こちら500mAで動作するようになってます。

最初使った感じ

なんというか、とりあえずコンピュータなんですね。iPhoneだってWiFiルーターだってコンピュータっちゃぁコンピュータなんですが、プログラミングするために作られてないんです。最初の感想は普通にコンピュータ、低性能だけどLinuxの動くARMマシンです。エディタでHelloWorld書いてコンパイルして走らせる、BASICで円が描ける、Quake3で遊べる、そしてきっとメガデ(略。

個人的にはコンポジット出力がついてるのがポイント高いです。時代は液晶になり、ブラウン管の電子ビームによるドットたちを拝める機会も少ない昨今ですが、RaspberryPiなら引退したアナログTVも活用できます。

アパーチャグリル官

アパーチャグリル官

メガデモプラットフォームとしてどーよ

  • 値段的に入手(参戦)が容易
  • ハードウェアの性能がある程度固定されている
  • 母艦なしでコーディングやビルドが可能

PCをはじめiPhoneやAndroidは機種や世代で性能が大きく異なりますが、RaspberryPiは値段($35)ありきのでそう大きくは進化しないですし、新モデルが出てもアップグレードに高々$35です。開発環境入りなので頑張ればそれだけで開発できます。数はでてるのでメガデモを再生できる人の絶対数も少なくはありません(そもそもまだメガデモがあまりありませんが)。現状はmaker系の文化でよく受け入れられていて、demosceneではあまり実績が無い、という感じでしょうか。 まだ無い、ということにしておきましょう。

…ただし、デモパーティーの写真でちまちま見かけるのであります。あのFunction2012でも。

 

メガデモの要素の一つとして、「このハードウェアでこれができるの!?」というのがあると思います(あるいは「4KBでこれかよ!」だったりとか)。RaspberryPiは性能の屋根が低いので限界に達しやすいです。みんなが同じ限界(性能)を知っていて、どうしてかその限界を超えたように見せるのがメガデモの一つの魅力だとしたら、RaspberryPiはプラットフォームとして面白そうだと思えてきませんか?

ARM700MHzとメモリ512MBというのは考えようによっては十分に大富豪です。1920x1080で動かすと厳しい面もありそうですが、そこがチャレンジしがいがあるのかもしれません。実際ゲームはQuake3が動いていますし、最近の話題ではMineCraftのプログラマブル版が移植されたとのことです。何か作ったり移植したりするプラットフォームとして、特に海外で注目されてる証拠かもしれません。

現状の難点は

  • ツール類は限られてるので、作るものによっては母艦が必要(テクスチャとかポリゴンモデルとか)
  • emacs使いは忍耐力が上がってレベルアップするかもしれない
  • C++でSTLとかboostをガンガン使うとレベルアップするかもしれない、もちろん忍耐力が
  • VideoCoreの中身はクローズドなので直叩き系の最適化は無理かもしれない

CPUの性能ですが、現行のPCのシングルスレッドと比べると1/10くらいの性能でしょうか。参考までにaobenchの値を載せておきます。

gcc (GCC) 4.7.2, HardFloat版
コンパイルオプション: -O2 -lm
実行時間: 30.50 秒

技術情報は主にフォーラムWikiGitHubになります。たいていはググれば救われます。

OSと開発環境

御託はこの辺にして、具体的な話に移りましょう。まずOSに選択肢があるのですが、ここではLinuxに限定します。BSDとかPlan9とか動き出してるっぽいですが、試してないので省略します。

LinuxディストリビューションはとりあえずRaspbianを使ってみて、重いと感じたらArchLinuxARMなど軽量なものも試してみるとよいでしょう。後者は初期状態ではウィンドウシステムすら入ってませんが、「んなもんいらねーよ」って人にはピッタリなディストリです。どちらもここからSDカードのディスクイメージをダウンロードできます。あとはSlackwareARMも動いてるようです。

開発はGNUツールチェインを使います。グラフィックや音声はVideoCoreが担いますので、必要に応じてVideoCoreのダイナミックリンクライブラリを使います。VideoCoreのグラフィックには低レベルなウィンドウの概念があり、任意の場所にオーバーレイ表示したりできます。なのでフルスクリーンで表示する分にはウィンドウシステム無しでも問題ありません。どのディストリでもVideoCore関連のものは /opt/vc/ に入っていて同じ構成になっています。/opt/vc/include にヘッダが入っています。これを見れば何があるのか察せられますね(OpenWFが実装途中だったり)。

ファームウェアのリポジトリにはサンプルプログラムもあるので参考になります。OpenGL ESはこんな感じ、音声出力(PCM)はこんな感じ、GLSLはこんな感じです。これらサンプルのグラフィックはVideoCoreのUndocumentedなAPI(vc_dispmanx_*)を使っていますが、今後はKhronosのOpenWFに移行していくというです。

 

RaspberryPiでもGLSL!

RaspberryPiのOpenGL ESは2.0対応なのでGLSLが使えます!せっかくGPUを搭載しているのですから、使ってあげないとかわいそうなじーぴーゆーになってしまいます。RaspberryPiでGLSLライブコーディングできるツールが3つほどあり、そのうち2つが既に知られています。既にお持ちの肩はぜひこの機会に試してみましょう。

1つめがターミナル上(非ウィンドウシステム)で動くGLSL Sandbox on the Raspberry Pi(youtube)。Raspbianを使っている場合はこれが使えます。ArchLinuxARM上ではがんばってみたのですが動きませんでした。自分の好きなエディタ(vim,emacs,nano)を使えるところは良いですね。実装はPython(+pyopengles)ベースです。

2つめがquint (youtube)。Qtで実装されてるのでウィンドウシステムが必須っぽいです。GLSLの書き方もQMLに埋め込む感じでちょっと特殊です。実装はC++(+Qt)。

 

そして今回「第三の男」を紹介します。PiJockeyはRaspberryPiのターミナルでも動くタイプのツールで、エディタは自分の好みのものを使えます。上記2つのツールに微妙に不満があったので急ぎで作りました。小さいオフスクリーンに描画して画面サイズにスケーリングするとかできます。逆にいうとそんなしてFPS稼ぐしかないのですが。それとエフェクトレイヤが何層か重ねれます、デフォルト設定では7枚までです。1つ前のレイヤはsampler2D prev_layerにて参照できます。ポストエフェクト系で遊びたい場合には使えるんじゃないでしょうか(ただしbackbufferはまだ実装されておりません、そのうち…)。実装に際してはholeさんのlivecoderが大いに参考になりました(感謝)。

本当はyoutubeに動画を上げたかったんですが、まともに撮影できる機材と時間がなく、断念。。コードの方もまだ突貫工事中です。

バイナリだけのtarも用意しておきましたが、hard-floatを使ってるバイナリなのでArchLinuxARMかRaspbianでしか動作しないと思われます。・・・実はRaspbianでの動作確認はしていません(たぶん大丈夫でしょう)。

いくつか単純極まりないポストエフェクトのコードを載せておきます。

エフェクトなし

元のコードはGLSL Sandoboxより

 

blur.glsl: 位置をずらした4サンプルの平均をとる軽い実装(画面中心からの距離に比例)

#ifdef GL_ES
precision mediump float;
#endif

uniform vec2 resolution;
uniform vec2 mouse;
uniform sampler2D prev_layer;
uniform float time;

#define BLUR_POWER 8.0

void main(void)

{   vec2 uv = gl_FragCoord.xy / resolution.xy;
    vec2 center = resolution * 0.5;
    float vig;
    vec4 col1, col2, col3, col4;
    vig = distance(center, gl_FragCoord.xy) / resolution.x;
    vec2 pixel_size = 1.0 / (resolution + 0.5) * (vig * BLUR_POWER);
    col1 = texture2D(prev_layer, uv);
    col2 = texture2D(prev_layer, uv+vec2(0.0, pixel_size.y));
    col3 = texture2D(prev_layer, uv+vec2(pixel_size.x, 0.0));
    col4 = texture2D(prev_layer, uv+pixel_size);
    gl_FragColor = (col1 + col2 + col3 + col4) * 0.25;
}

ブラー:NearestNeighborでサンプルしてるので境目が見えてよろしくない

 

vignetting.glsl: 周辺減光

#ifdef GL_ES
precision mediump float;
#endif

uniform vec2 resolution;
uniform sampler2D prev_layer;

#define VIG_REDUCTION_POWER 1.35
#define VIG_BOOST 1.24

void main(void)
{
    vec2 uv = gl_FragCoord.xy / resolution.xy + 0.001;
    vec2 center = resolution * 0.5;
    vec4 col;
    float vig;
    col = texture2D(prev_layer, uv);
    vig = distance(center, gl_FragCoord.xy) / resolution.x;
    vig = VIG_BOOST - vig * VIG_REDUCTION_POWER;
    gl_FragColor = col * vec4(vig, vig, vig, 1.0);
}

周辺減光

 

slide_rgb.glsl: RとBチャンネルをずらしてカッコつける。

#ifdef GL_ES
precision mediump float;
#endif

uniform vec2 resolution;
uniform vec2 mouse;
uniform sampler2D prev_layer;

uniform float time;

void main(void)
{
    vec2 uv = gl_FragCoord.xy / resolution.xy;
    vec4 col = texture2D(prev_layer, uv);
    vec4 col2, col3;
    vec2 slide = vec2(0.008, 0.0);
    col2 = texture2D(prev_layer, uv-slide);
    col3 = texture2D(prev_layer, uv+slide);
    col = vec4(col2.r, col.g, col3.b, col.a);
    gl_FragColor = col;
}

RとBチャンネルを横にスライド

 

全部入り(1350円): 7枚まで重ねられます。

具材全部入り

内部がフォーマットがRGB565なので色の境目が見えてしまいますね。はい、RGBA8888も選べるようにしておきます。

実行するときは

./pj shader/raytracing.glsl effect/blur.glsl effect/vignetting.glsl ....

のようにします。実行したあとはバッファリングなしのキー入力待ちになります。

  • <キー または >キー:  レイアウト変更
  • fキー: フルスクリーン切り替え
  • tキー: FPS表示
  • [キー または ]キー: オフスクリーンのスケーリング増減
  • qキー: 終了
  • ?キー: ヘルプ

シェーダーのソースはエフェクトも含め、タイムスタンプが押された段階で再コンパイルされるので、pjをバックグラウンドで動かすか、GNU ScreenTMUXなどを利用します。SSH経由で編集してもOKです。

tmuxとemacsとpj、横レイアウト

ググればもっと素晴らしいエフェクトが沢山ありそうです。ただしRaspberryPiでまとも動くかどうかは試してのお楽しみ。リンク後のシェーダープログラムの容量が決まってるらしく、長すぎるとOUT_OF_MEMORYと言われます。なので軽いシェーダーに軽いエフェクトを積んでくのが向いてるようです。プライマリなレイヤーに手を入れず、エフェクトのコードだけ変更したり、重ねるエフェクト、その順序を変えたりできるのはちょっと便利だと思います(自画自賛)。

 

終わりに

いかがでしたでしょうか。きっとLED点灯の次はメガデモな気がしてきたことでしょう。pouetのRaspberryPiプラットフォームのメガデモ一覧はこちらです。はい…少ないですね。でも今後どうなるかちょっと楽しみにしてるこの頃です。あるいは、今RaspberryPiで遊んだ子供たちが将来何かを開花させるかもしれません。お子さんがいる方はおもちゃとして買ってあげるとメガデモ英才教育ができてしまいますね。GLSLでも遊べる4000円くらいのデバイスというのは他に無いんじゃないでしょうか。もうなんか通販のセールスマンみたいになってきたのでこの辺で…。

 

 RaspberryPi関連のリンク

 

Comments (0) Trackbacks (0)

No comments yet.


Leave a comment

Trackbacks are disabled.