R言語にシェーダー芸を求めるのは間違っているだろうか

この記事について
2025年9月にオンラインでおこなわれた第119回R勉強会@東京(#TokyoR)で、「R言語からはじめるシェーダー芸入門」というタイトルで応用セッションをやりました。発表に使ったスライドは以下です。
この発表では、R言語で疑似的なシェーダー芸をやることをゴールとして、これを実現するためにnativeshadrというRパッケージをつくったことを紹介しました。この記事は、このときに発表したことについて、あらためて簡単に紹介するものです。
nativeshadrをつくった経緯
これは今回の発表では話さなかったことですが、まず、この話を考えた経緯として、今年の夏ごろにかけて、R言語でクリエイティブコーディングすることに挑戦してみたという背景があります。最近は体調が優れなかったりしてあまり手がつけられていないのですが、このときそうした活動をしていたときの課題感として、Rで描いた画像に対して、Rからシェーダーを適用できるようにしたいという思いをもっていました。
Rから画像にシェーダーを適用する手段としては、いま個人で開発しているskiagdでSkSLを書くことによってもすでに実現できていました。しかし、Shadertoyなどで見られる既存のシェーダーをSkSLに移植するのはまあまあ手間がかかることや、skiagdでRuntime Shaderを適用するにはテクスチャにしたい画像を一度Skiaのピクチャに持ち込まなければならないことなど、いくつかの点で不満があり、こうした課題を解決するために、既存のシェーダー言語からより簡単に移植できるようなコードによって、Rでふつうに扱われる画像データをテクスチャとして受け取ったり、同様にそうした画像データを出力したりできるような仕組みをつくることにしました。
そうしてできたのが、nativeshadrパッケージというわけです。
データサイエンス以外のRの使い方
nativeshadrをつくった前後に、ちょうどTokyo.Rの演題の募集があったので、これを紹介するような応用セッションを準備することにしました。
発表をつくるにあたって、やや気を遣った点が、「R言語からシェーダー風のプログラムを実行する」という、従来のR言語とはほとんど結びつかないようなRの使い方について、どのように工夫して紹介するかということでした。
私自身、すでにそのように紹介したことがありますが、R言語というのはやや変わった立ち位置のプログラミング言語です。R言語について紹介がなされるようなシーンでは、ふつう「Rは統計解析やデータ分析に特化した言語です」などと紹介されることが多く、実際、R言語を使って統計解析やデータ分析を学べる資料は数多くある一方、プログラミング言語としてのRそのものについて紹介している資料はかなりめずらしいというのが実情です。
また、その利用者も、プログラマやシステムエンジニアというよりは、学生や研究者、あるいはデータサイエンティストと呼ばれるような人たちがほとんどだと思われます。私自身が訊いてみたことはないですが、Tokyo.RにR言語についての話を聞きに来る参加者も、おそらく、そのほとんどはそうしたバックグラウンドを持っている人たちでしょう。もちろん、一口に「学生や研究者、あるいはデータサイエンティスト」といっても、その裾野はかなり広くて、きっといろんな専門分野があるのでしょうが、少なくとも、いきなりクリエイティブコーディングとかシェーダー芸とか言ってみたところで、馴染みがあるような人はほぼいないだろうと予想できました。
そこで、私がしたい話の本筋とはまったく関係がなかったのですが、とりあえずtidyverseという単語を冒頭に突っこんでみて、tidyverseという馴染みのある宇宙の外側の世界を覗いてみよう!というような話の流れをつくることにしました。
実際の発表では、R言語の「データサイエンス以外の利用例」として、3つの例を紹介しました。1つ目は、Mike Chengさんによる、Another WorldのR言語への移植の例です。
紹介したYouTube動画は2022年のRStudio Confのセッションのひとつで、アドベンチャーゲームの映像をRのグラフィックデバイスによる「プロット」として表示しているという、非常にインパクトのある内容になっています。
2つ目は、Tyler Morgan-Wallさんによる、3D映像をRからレンダリングしている例。
ここで紹介したYouTube動画も2022年のRStudio Confのセッションの映像で、rayrenderなどで作ったジェットコースターのコースに沿うように、カメラの視点がワールドの中を移動していくという、これももはやR言語なのかなんなのかわからないような衝撃的な映像です。
3つ目には、英語圏ではしばしば見られるRtistryを紹介しました。具体例としては、Koen Derksさんが公開しているaRtsyでつくれる画像と、Thomas Lin Pedersenさんの個人サイトに掲載されている作品を見せました。
これらの例を紹介したうえで、「R言語は、tidyverseというエコシステムを中心として、データサイエンスのための道具のように紹介されがちだけど、アイデア次第でいろんな用途に使うことができる!」という主張をして、tidyverseという私たちが住み慣れている宇宙から飛び出してみよう、というメッセージを用意しました。なかなか魅力的なよい導入になったと思います。
R言語でもシェーダー芸がしたい!!
そうした導入の後で、Rでクリエイティブコーディングやシェーダー芸をやってみるという、この発表でのゴールを提示しました。クリエイティブコーディングとシェーダー芸という用語の簡単な説明をしたうえで、Rでシェーダー芸を実現するために、Rcppを使ってRのグラフィックデバイスで直接描画できるような画像をつくれるようにする枠組みのひとつとしてnativeshadrというパッケージをつくったことを紹介し、その仕組みを簡単に説明しました。
ここでいう「Rのグラフィックデバイスで直接描画できるような画像」というのは、nativeRasterと呼ばれるデータ形式のことです。nativeRasterというのは、このひとつ前のブログ記事でも紹介しましたが、Rの組み込みの型のひとつで、各ピクセルの色を表す32ビット符号なし整数の行列によって、1枚の画像を表現しているデータ形式です。
発表では、nativeRasterが通常のinteger matrixと同様にして作成できることを説明したうえで、これを直接返すようなRcppの関数としてシェーダー言語で書かれたプログラムを移植することによって、ピクセルシェーダーの挙動を疑似的に再現できることを説明しました(より詳しいことについては、この記事の冒頭に貼った発表スライドの中身や、nativeshadrのREADMEを読むなどして察してください)。
Rでのシェーダー芸の実践例
nativeshadrの仕組みをざっくりと説明したうえで、最後に「実践例」として、nativeshadrを使って作成した画像や動画をごく簡単に紹介しました。いずれについても、コードをあわせて掲載したりはしているものの、そのコードでやっていることの説明というよりは、こういったことができるという事例の紹介にとどめるつもりで説明するようにしました。
たとえば、raggを使ってnativeRasterとしてキャプチャしたふつうのggplot2のグラフをテクスチャとして評価しつつ、エフェクトを加えてGIFアニメーションをつくった例を紹介しました。
これは、次のブログ記事で書かれているHLSLのコードから移植して作成したものです。
また、次のShadertoyやGLSL Sandboxの作品から移植して作成した映像も紹介しました。
こんなのです。
後のほうのGLSL Sandboxからの移植については、「住み慣れた宇宙を飛び出そう」というメッセージを決めたときにこれを使おうと思った作品で、上手くメッセージを回収できた感じがしてよかったと思います。
まとめ
といった感じで話をしてきて、次の3つのバレットを見せながら、発表全体の「まとめ」ということにしました。
- Rcppでシェーダー風のプログラムを書くことによって、Rのグラフィックデバイスで直接描画できるような画像を出力すれば、Rでシェーダー芸ができる
- これを実現するためにnativeshadrというRパッケージをつくった
- R言語の世界はデータサイエンスだけじゃないかも!? 住み慣れた「宇宙」を飛び出す勇気を持とう
感触としては、こういうおもしろい雰囲気の話を、Rのユーザーにとって身近な領域と接地するように紹介できたので、構成としてはわりと上手くいったんじゃないかなと思っています。
一方で、話の流れとしてアート寄りの事例を中心に紹介してしまったので「Rでこんなことができるなんてすごい!」みたいな感想は確かにもってもらえたかもしれないものの、こういうふうにしてnativeshadrで比較的簡単に画像処理が書けるようになるとして、実際のところどういった感じで嬉しいのかとかはまったく伝わっていないはずで、そのあたりは別の機会にフォローしてみてもいいかなとは思いました。
また、発表タイトルでは「入門」と言いつつ、シェーダーの書き方とかの話題はスルーしてしまったのもあるので、そのうちggfxと組み合わせてピクセルシェーダーを書くやり方などをもう少し具体的に説明する記事を書きたいような気はしています(書けるとは言ってない)。