GrabPassで取得したテクスチャが意外と後まで使える

執筆者: Shiokai

はじめに

この記事は、OUCC Advent Calendar 2021の15日目の記事です(投稿日がずれているのは気にしない)。前回はwatamario15さんのテトリスの電子辞書移植でした。
またこの記事はUnityのShaderのGrabPassに関する内容です。

本題

シェーダーを触ったことのある人なら大抵一度は触ってみたくなる(よね?)GrabPassではありますが、Unityのドキュメントにはわずか1ページの説明しかありません。その中に、GrabPassで取得したテクスチャ(以下GrabTex)は「後続のパス」で使用できるとあります。この「後続のパス」というのが肝で、私は当初同じシェーダー(SubShader)内で後に来るパスのことを指しているのかと思っていました。

ところがある日Twitterを見ていると、異なるシェーダーでもGrabTexが使用できるといった内容のツイートを見かけました(何方のツイートか分からなくなってしまってリンクが貼れない……)。これは試さねばと思い、GrabPassだけをするシェーダーと、GrabTexを貼るだけのシェーダーを書いてみると、なんと確かに異なるシェーダーでもGrabTexが使えているではありませんか!

さらにもう少し触ってみると、GrabPassが呼ばれてから、再度同じ名前のGrabTexでGrabPassが呼ばれるまでの間であれば、初めのGrabTexがどんなシェーダーからでも使える様でした。GrabPassが呼ばれるタイミングは通常のPassと同様にRenderQueueと前後関係による(はずな)ので、単純にRenderQueueがGrabPassより後ならGrabTexがそのまま使えてしまうことになります。

更に、GrabPassとGrabTexを使うシェーダーのRenderQueueを逆転してみたところ、なんと前のフレームのGrabPassで取得したと思しきGrabTexが使用できてしまいました。ただ、その場合オブジェクトを動かすかどうかでうまく描画できなくなることもあったので、実用に耐えうるかどうかは怪しいものですが。
これを見るに、GrabTexが使える「後続のパス」は、時系列的に後であれば本当に何でもいいようです。

注意点としては、GrabPassをしているシェーダーがカリングされてしまうとGrabTexを使用している側には意図しないテクスチャ(たいてい灰色一色)が渡されることになるので、オブジェクトの配置やBoundsには気を付ける必要があるでしょう。

これで何ができるの?

GrabTexが他のシェーダーで使えることでどういった表現ができるようになるかと言われると……正直自分にはさっぱり何も思いつきません。例えばオブジェクトの座標を色情報にしてシェーダー間で受け渡しできたりはしますが、それはGPUInstancingを使った既存の手法もありますし、何よりスクリプトが使えれば簡単にできることで、では他にわざわざ他のシェーダーからGrabTexを持ってきてするようなことがあるかというと……。この記事を読んだ方が何か素晴らしいアイデアを実現してくれるといいなぁ。

終わりに

ゴミみたいな文章が出来上がってしまった……

OUCC Advent Calendar 2021、次回の担当者はちょくぽさんです。

テトリスの電子辞書移植

執筆者: watamario15

これは OUCC Advent Calendar 2021 の14日目の記事です。前日の記事は...おかしいなぁ誰もいないぞ?w 明日の記事は shiokai が担当します。

さて、何を書きましょうか。マジでネタがありません。何を隠そう今まさに12月14日23:22です。今年は大量の課題やら部室の引っ越しやらノーキャリアの学祭やら Brain Wiki の整備やらの事務的なことが多く、個人でプログラムを書く時間をあまり取れなかったのです(そういえば、今年から Brain Wiki の Admin になりました)。情報科学科なら講義でプログラムを書くのでは?と思うかもしれませんが、はっきり言ってあんなのおまけで数学や回路設計の方がはるかに workload が高いです。というか、プログラミングの講義自体レポートを書く部分が本質みたいなところあります。つらい。

うーんどうしようか、そういえばギリギリ今年のはじめに OB の方が作ったテトリスを電子辞書に移植するのやってたな、あれの流れと宣伝でも書いとくか(ここでようやくタイトル欄を埋める)。

経緯

さて、電子辞書とは言っても明確な機種を指定していませんでしたね。機種は SHARP のカラー電子辞書 Brain シリーズです。ただし、2021年発売のモデル以降は見た目こそほぼ変わりませんが中身が全く違うので対象としません。昨年の私の記事で、実際に作り方を説明していますので興味があれば見ていってください。

まず、なぜ移植しようと思ったのか。それは突如として OB さんの1人が

「最近win32apiでテトリスを実装しました。」

という投稿と共に OUCC の Discord (内部サーバーで、当時はこちらがメインの活動場所だった)でテトリスを添付されたことが始まりです。何という奇遇でしょうか。WinCE が動く SHARP Brain は、ライブラリこそ碌に流通していませんが Win32 API の subset を利用することができます(詳細は昨年の記事)。そして、その完成度の高さにも驚きました。結構昔から電子辞書で動くテトリスは実はあったのですが、それはモノクロで乱数も seed 値が全く同じでパターンが変化しない、とても単純なものでした。

「これは移植すると面白いかもしれない」

そうして、移植が始まったのでした。

序盤

本当は詳しく書きたいものですが、何しろ今 23:38 です。時間がありません。概況だけ書きます。

まず、最初の状態でそのまま CeGCC に掛けるとしっかりエラーになりました。まあ、そうなりますよね。想定内です。あくまで subset の API しかサポートしないので、そのまま動くなんぞ甘い期待は禁物です。

まず、1つは menu bar の仕様違いです。ここは WinCE をやるときの1つの沼で、私もかつて知るまではずっと何がダメなのか分からなかったし、分かっても仕様がどこを調べても書いていないので苦労しました。CE はモバイル用 OS で、それゆえ画面領域が貴重です。狭い範囲に最大限の情報を詰め込むため、×ボタンなどの並びと menu bar を共通にできる command bar が導入されています。なので、これに置き換える必要があるのです。とはいえ、この苦労は既に1年前に経験したものですから、簡単に切り抜けました。

中盤

あ^~もう 23:46 じゃないか!!やばい!!

次はレイアウトの問題です。何か酷いことになってたんですよねこの段階では。これも command bar の仕業です。通常 Windows なら menu bar は描画範囲外ですが、何と CE では範囲内です。なので、その分画面全体を下にずらさなければなりません。いやぁとんだ沼ですね。しかも、幅はさすがに取得する API があるのですが画面が出てからしか使えません。よって、ウィンドウサイズを起動した後に変えるような仕様変更をすることになりました。

終盤

ここが一番苦労した部分です。なぜか適切に描画されなくなる問題が生じて、あれやこれやと色々試す沼にはまりました。時間も無いので (23:54) 結果だけ書いてしまうと、電子辞書の超低スペックでもまともに動くようにするために FPS を落としたとき、プログラム仕様をよく分かっておらず「やってはいけない」設定変更を実施したことによるものでした。悲しいですね。

成果

https://github.com/OUCC/tetris

何はともあれ一応動くものは完成しました。上記の GitHub Repository に置いてあるので、対象機種をお持ちの方はぜひ遊んでみてください(くれぐれも先生の前でやって没収されぬよう...)。ただ、割と高度な音声処理が組み込まれているらしく、そのせいか電子辞書では結構もっさりします(十分遊べますが)。あと、電子辞書版が遊ばれる状況を考慮して初期状態では音量が0になっています。右のスライダーやページ送りボタンで音量を上げると、効果音付きで遊べますので是非お試しください。

(あー10分超過したッ!!許せッ!!)

Python 講習会を開催

5/22 (土) に Python 3 の講習会をオンライン開催しました。

Python は C/C++ のような言語よりも手軽に扱えることから多くの人に好まれている言語です。また、統計処理や機械学習系のライブラリが充実しており、その分野でも広く使われています。今回の講習会では、Python が持つ基本的な機能を網羅的に解説し、AtCoder Beginners Selection で演習することで、Python を活用できるようになることを目標としました。

資料は Discord で配布していますので、今回参加できなかった方もその資料で学習可能です!

今後の予定

次は6月初めに Linux の講習会、そして 5/29 - 6/26 にチーム開発イベントを同じく Discord 新歓サーバーで予定しています。興味のある方は https://discord.gg/jBM2NP7ZxK からご参加ください。なお、最新情報は Discord 内及び新歓特設サイトで紹介していますので、こちらもご確認ください。

Git と OOP の講習会を開催

5/15 (土) に SourceTree と GitHub による Git 講習会、5/16 (日) に TypeScript を用いたオブジェクト指向プログラミング (OOP) の講習会を Discord を用いてオンラインで開催しました。

Git 講習会

Git は分散型バージョン管理システムで、近年のソフトウェア開発で頻繁に利用されるほか、複数人開発では必須ツールとなっています。仕組みが複雑で初心者にはとっつきにくいのが難点ですが、使いこなせればソフトウェア開発を力強くサポートしてくれるとても便利なツールです。今回は、初学者にも比較的扱いやすい SourceTree という GUI ソフトウェアを用いて、Git を扱うのに最低限必要な技能を身に着けることに重点を置きました。

OOP 講習会

オブジェクト指向は「関数と型の関連付け」と「抽象化」を目的としたもので、「カプセル化」「継承」「多相」が主な特徴となります。近年はソフトウェアのメンテナンス性を重視する傾向が強まってきており、そういった点で合理的な OOP が広まっています。また、この考え方を取り入れた言語も数多く存在します。しかし、これもまた初学者にはとっつきにくいものであることから、今回は入門編としてその目的や定義を紹介したのち、TypeScript を題材として実際の実装例を確認しました。

今後の予定

次は 5/22 (土) に Python、6月初めに Linux の講習会を、同じく Discord 新歓サーバーで予定しています。興味のある方は https://discord.gg/jBM2NP7ZxK からご参加ください。なお、最新情報は Discord 内及び新歓特設サイトでも紹介していますので、こちらもご確認ください。

Blender と競プロの講習会を開催

5/8 (土) に Blender による 3D モデリング、5/9 (日) に競技プログラミングの講習会を Discord 新歓サーバーを用いてオンラインで実施しました。

Blender 講習会

約 90 分間という短時間で、VRChat で使える Avatar 制作の流れを学びました。短時間制作であることからポリゴンや着色などが荒くなっていますが、それでも様々な必須技術を学ぶことができました。

競プロ講習会

阪大競技プログラミング部 RAINBOU の部長を務めるこたまねぎ(Twitter: @small_onions)氏に、特別に講習会を開いていただきました。テーマは「全探索攻略」で、バグを減らすためのマクロ定義や文字列化 bit 全探索の活用、また C++ ライブラリの活用など、競プロに最前線で取り組んでいる方による様々なノウハウやアドバイスなどはとても新鮮で、競プロをそれなりにやっている受講者にとっても新たな発見がありました。

REP マクロを使う
bit 全探索
順列全列挙
複雑なデータ構造の操作は関数化

ご協力くださったこたまねぎ氏に感謝です!今後も、同じ志を持つ別団体との交流を進めていきたいですね。

今後の予定

次は 5/15 (土) 15:00 に Git、5/9 (日) 14:00 にオブジェクト指向プログラミングの講習会を、同じく Discord 新歓サーバーで予定しています。興味のある方は https://discord.gg/jBM2NP7ZxK からご参加ください。なお、最新情報は Discord 内及び新歓特設サイトでも紹介していますので、こちらもご確認ください。

ゲーム制作と Web の講習会を行いました

昨日 4/24(土) に Unity を用いた 2D ゲーム制作の講習会、そして本日 4/25(日) に HTML/CSS/JavaScript を用いた Web サイト制作の講習会を、Discord 新歓サーバーでオンラインで行いました。今回も、資料は Discord 新歓サーバーで配布していますので今回参加できなかった方もご参加下されば参照可能です。内容に関する質問もいつでも受け付けております。

2D ゲーム制作 (Unity)

Unity での 2D ゲーム制作の基礎として、ものすごく単純なゲームを作成しました。

単純とはいっても、スクリプトの書き方や当たり判定の実装、シーンの作成や遷移、そして Unity の各種機能の使い方など、Unity 初心者が身に着けるべき内容を丁寧に説明しています。Nintendo Switch 等の有名プラットフォームでも Unity で開発されたゲームが増えてきていますが、そういったゲーム開発の裏側に触れることができる講習会となりました。

以下に講習会のスライドを抜粋して掲載します。

Web サイト制作 (HTML/CSS/JavaScript)

Web サイト制作において最も基本的な HTML/CSS/JavaScript を用いて、簡単な Web サイトを作成しました。

まずは HTML で Web サイト制作への導入を行い、CSS で背景や文字などのスタイルを変更できることを確認したのち、最後に JavaScript でインタラクティブな Web サイトを実現できることを学びました。このブログも含め、日々目にする Web サイトの仕組みに触れることができる講習会となりました。

以下に講習会のスライドを抜粋して掲載します。

今後の予定

次は 5/8 (土) に Blender、5/9 (日) に競技プログラミングの講習会を、同じく Discord 新歓サーバーで予定しています。オンラインなので緊急事態宣言などの影響を受けることはありません!興味のある方は https://discord.gg/jBM2NP7ZxK からご参加ください。なお、最新情報は Discord 内及び新歓特設サイトでも紹介していますので、こちらもご確認ください。

C/C++ の講習会を開催しました

本日 4/18(日) に C 講習会、その準備編として昨日 4/17(土) に C++ 講習会を行いました。今回参加できなかった方も、講習会資料を Discord 新歓サーバーで配布していますので、ご参加下されば参照可能です。内容に関する質問もいつでも受け付けております。

C は広く利用される非常に有名な言語で大学の講義で1年から早速学びますが、プログラミング初学者にとっては修得が難しいものとなっており、それに向けた助けとなることを目指した内容としました。

講義の予習として、また、講義が理解できなかったときの参考書代わりとして、ご活用いただければ幸いです!

現役生と卒業生で LT 会を開催

本日、OUCC の卒業生と現役生との交流会を兼ねて卒業生による LT 会を開催しました。

内容は社会人としての経験や大学院での研究経験、また趣味で行っているプログラミングや電子回路技術の紹介といった様々な貴重なお話をして頂きました。

OUCC では、今後もこのような卒業生との交流会の機会を作っていけたらと思っております。ご協力くださった卒業生の皆様、ありがとうございました!

合格おめでとうございます!

令和3年度大阪大学一般入試を突破された新入生の皆様、合格おめでとうございます!
今年度はコロナにより模試日程や授業形態が例年と異なることに加え、本年度から始まった新しい試験の共通テストが実施されたということもあり、受験生は例年よりも大変な思いをされたと思います。ちなみに、中の人は基礎工学部情報科学科の学部4年生ですが、今年の倍率は3.8倍と聞いて驚いております。(今年受けたら落ちてそう...汗)

OUCCでは春に新歓活動として、プログラミングやITスキルに関わる講習会を開催します。詳しい情報はTwitterの新歓アカウント公式サイトにて順次公開しますので、是非ご覧ください!

大学ではたくさんの出会いや学びの機会、今までの人生では味わえなかった経験をすることができます。激動の一年(もしくはそれ以上)を乗り越えた皆様と共に大学生活を送ることができるのを心待ちにしております。

dotfiles を作ってみた

公開日: 2021年2月20日 最終更新: 2021年2月20日 執筆者: watamario15

大学の課題を全て出し終わり、ようやく自分の作業に取り組むことができるようになりました。無事に単位が取れていて、GPA もあれば良いのですが...

色々とやることはあるのですが、まずは dotfiles を作成することにしました。

dotfiles とは

検索すればすぐに分かるのですが、簡単に言うと環境構築を秒速で終わらせるためのファイル群です。Unix 系のソフトウェアの多くはテキストファイルを設定ファイルとして扱うものが多く、それをカスタマイズすることで自分好みに設定することができるようになっています。ここで、そのファイル群とそれを適切に配置したりその他の設定をしたりするスクリプトもセットで GitHub に上げておけば、新しい環境でも git clone してスクリプトを走らせるだけで即座に自分の環境が出来上がる、という訳です。

なお、dotfiles という名前は、設定ファイルの多くが名前がドット (.) で始まる「ドットファイル」であることが由来です。ちなみに、Unix 系システムにおいてドットファイルは隠しファイルとなります。

どんな dotfiles を作ったのか

これが私の dotfiles です: https://github.com/watamario15/dotfiles
機能や使い方などの説明は Readme.md にありますので、気になる方は読んでください。もちろん、install.sh.bashrc とかを参考にしてもらっても構いません(特に alias 周り)。まだまだ未熟ですが、少しずつ成長させて行けたらと思っています(この記事を読んでいる方で、もし「絶対これは設定すべき!」みたいなのがあれば issue 立てたり pull request 出したりして頂けると嬉しいです)。initialize.sh に付けた CASLII/COMETII のシミュレータをインストールする機能、阪大生(だけ)には割と需要ありそうですね(笑)

今回の投稿は以上です。ところで、推薦入試の合格発表があったそうですが、合格した皆さんおめでとうございます!もし合格してサークルを探している、という方で OUCC の活動に興味を持たれた方がいらっしゃれば、ぜひ Discord 新歓サーバー に参加してみてください(もちろん上回生も大歓迎!)。もちろん、これから一般入試だという方も全力で応援します!