koturnの日記

普通の人です.ブログ上のコードはコピペ自由です.

List<T>の内部の配列の参照を取得する

C#

はじめに C# の List<T> はいわゆる可変長配列のことであり,内部的には配列を持っている. 要素追加の度に残り容量を確認し,不足するようであればより大きな配列を確保し,そこに既存の要素をコピーした上で新しい要素を入れるという実装になっている. List<T> </t></t>…

lilToonのカスタムシェーダーを作るときのTips

基本 基本的なカスタムシェーダーの情報は下記公式ドキュメントを参照すること. lilToon カスタムシェーダーの作り方 ドキュメント中にある下記のファイルがテンプレートであり,この中の数ファイルを編集する. カスタムシェーダーテンプレート(zip) ジ…

レイマーチングにおけるマーチングループのbreakについて

shaderlabでレイマーチングのシェーダーを書き,マーチングループの部分のアセンブリコードを確認して不満に思う点があった. 本記事ではマーチングその不満に思う点を解消する手法について述べる. 扱うシェーダーコード この記事では下記のシェーダーコー…

モデル行列に関するメモ

モデル行列の調理 モデル行列とはオブジェクトをローカル座標からワールド座標に移動する行列であり,具体的には平行移動,回転,拡大縮小の3つを行う行列である. Unityのシェーダーとしては unity_ObjectToWorld というuniform変数で与えられる. この行列…

CustomRenderTextureVertexShader()を改善する

はじめに カスタムレンダーテクスチャの頂点シェーダーはUInityの標準ライブラリ CustomRenderTextureVertexShader から提供されており、これを用いることになっている。 しかし、実装を読み、なおかつDirect3D11の出力アセンブリを読んだところ、あまりよく…

レイマーチングにおける正規化法線ベクトルの計算と実装

たまには趣向を変えて,ですます調で記事を書いてみようと思います. レイマーチングではライティングを行うために正規化法線ベクトルの計算が必要となります. この記事ではいくつかの正規化法線ベクトルの計算手法について述べることにします. なお,僕は…

Unityのシェーダーにおいて,定数の整数乗を行う場合の繰り返し二乗法はループ展開されるか?

TL;DR 繰り返し二乗法の関数を定義し,指数に定数を指定した場合はループ展開される. しかし,pow(x, 5.0) のように指数が比較的小さい整数定数を指定した場合でも繰り返し二乗法をループ展開したものと同一のコード生成がされるため,自前で繰り返し二乗法…

シェーダーにおけるゼロベクトルの正規化

シェーダーにおいて,組み込み関数である normalize() にゼロベクトルを渡した場合,NaN になる. 正規化ベクトルの定義からも当然である. \begin{equation} normalize(\boldsymbol{v}) = \dfrac{\boldsymbol{v}}{\| \boldsymbol{v} \|} \end{equation} シ…

シェーダーにおける浮動小数点剰余(mod, fmod)の実装

TL;DR シェーダー言語によってその言語組み込みの fmod() (mod()) の実装は異なるため注意する必要がある. 挙動の罠に引っかからないためには自前で実装するのが安全である. GLSL // Equivalent to mod() in GLSL. float fmodglsl(float x, float y) { r…

PostgreSQLで外部テーブルに無理矢理UPSERTする

SQL

背景 PostgreSQLには外部のPostgreSQLサーバに格納されたデータをアクセスするためのpostgres_fdwモジュールがある. これにより,外部のテーブルを自身のサーバにあるかのように扱うことが可能となるが様々な落とし穴がある. そのひとつは,UPSERT(INSERT…

PNGファイル再圧縮ツールを改良した

TL;DR 2020-12-07にも記事を書いたツールだが,当時より機能追加を行ったため,再度記事を書くことにした. 大きくは下記4点が追加となった. VRMファイルを処理可能になった 元のPNGファイルの画像フォーマットをそのままにしておくオプションの追加 IDATの…

clusterの写真リネームツールを作った

TL;DR clusterで撮影した画像ファイルの一括ダウンロードで得られるzipファイル内のPNGファイル名を cluster_yyyy-MM-dd_HH-mm-ss_XXX.png という形式にリネームするツールを作った(yyyyMMddHHmmss は撮影日時の年月日時分秒,撮影日時=ファイル作成日時=…

zipファイルの再圧縮ツールを作った

TL;DR zopfliを用いて,zipファイルを再圧縮し,よりよい圧縮結果を得るCLIツールを作成した. リポジトリ 実行バイナリ 元ネタはkomiya-atsushi/zipzopであり,これをC# で再実装したものとなるが, ファイル単位での並列処理が可能 zopfli.dll の関数に渡…

Unityのシェーダで原点・XZコンパスを実装した

TL;DR 常に原点を指す,またX軸,Z軸を指す針も含むシェーダを作った. VRChatのアバターに付けるとベンリかもしれない 原点・X軸コンパスシェーダーできた.黄緑矢印が原点方向,赤矢印がX軸方向でアバターの向きに関係なく必ずその方向を指す.青矢印はX軸…

カスタムレンダーテクスチャでライフゲームを実装した

TL;DR カスタムレンダーテクスチャでライフゲームを実装してVRChatのアバターに付けた. ライフゲーム 背景 オタクはすぐにシェーダでライフゲームを実装するもの,らしい. N番煎じではあるが,VRChatのアバターにライフゲーム付けるのはすぐにできるなと思…

previm + MathJax 3.X

Vim

TL;DR previmでMathJax3.Xを使用できるようにする. 背景 previm/previmはMarkdownのプレビューを可能にするプラグインでとてもベンリである. これにMathJaxを組み合わせると,数式が書けるようになり,ものすごくベンリになる. このMathJaxであるが,2019…

C言語でダブルクオートで囲まれたカラムを含むCSVファイルのパースを行う

TL;DR タイトル通り,C言語でダブルクオートで囲まれたカラムを含むCSVファイル(RFC 4180 2.6章,2.7章参照)のパースを実装した. 背景 2021年にもなってC言語を書かなければならないことがあり,その中でCSVファイルのパースを行う必要があった. 既存の…

clusterに入り浸るようになって半年経過したことについてのポエム

この記事はclusterユーザーと加速する非公式 Advent Calendar 2020の14日目の記事です. clusterに来るようになったきっかけや,この半年の思い出についてつらつらと書きます. clusterに入り浸るようになったきっかけ 僕がclusterで本格的に遊ぶようになっ…

ZopfliPNGによるPNGの可逆再圧縮とVRMの容量削減について

この記事はIQ1 Advent Calendar 2020の7日目の記事です. TL;DR zopflipng.dllをいい感じに使うツールを作りました. 並列実行可能 zipアーカイブファイル内のファイルを一時的に書き出すことなく処理可能 更新日時タイムスタンプはそのままで再縮率実施 ま…

Unityでの変数・プロパティのアクセス性について考える

前置き 最近,Unityに触れており,C#を書くことが多い. 古いUnityの文化はわからないが,publicメンバ変数が気持ち悪くて仕方がない. (おそらく,古代のUnityではプロパティを使用できない,あるいは実行処理系がプロパティのインライン展開を行うことが…

C#のシングルトン

C#

背景 最近,UnityでC#を書くので,普通のC#を書くときに使っていたコードスニペットを整理していた. その中にシングルトンの実装が含まれているのを見て,そういえばこの実装はスレッドセーフなのか?と疑問に思ったのがきっかけで,C#のシングルトンについ…

IQ1の人間が書いているVimの設定の一部

この記事はIQ1 Advent Calendar 2018の10日目の記事です. 特に書くことを決めてなかったのと,最近Vimconf2018やOsaka.vim等でVimに対するモチベーションが高まっているのでVimのことを書きたいと思います. Vimのモチベーションが高まっていなかったら,艦…

C++におけるfinallyの実装

C++

はじめに この記事は世間では十分に議論され尽くしてきたC++におけるfinally句という話について書こうと思う. 「C++にはfinally無くて不便ですよね」という言葉は,実際にお仕事をしていて聞くことのある言葉なのだが,やはりC++初心者はfinallyが無い理由…

多次元の std::array を楽に扱う

C++

はじめに 前回の記事では,多次元の std::vector について書いた. 今回は多次元の std::array について書こうと思う. まず,std::array は組み込み配列と同等の機能を提供するクラスである(というより,組み込み配列のラッパークラスである). 使用方法…

多次元の std::vector を楽に扱う

C++

はじめに C++には std::vector という動的配列を扱うクラスが用意されている. このクラスはよく利用され,時には std::vector の std::vector,すなわち多次元の std::vecotr が用いられることがある. しかし,この多次元の std::vector は std::vector<std::vector<int>> v</std::vector<int>…

競技プログラミングとC++のアレコレ

C++

はじめに この記事は,C++初心者だけど競技プログラミングでC++を使っている,C++で競技プログラミングをやってみようと思っている人に向けた記事である. 「C++初心者」対象であって,プログラミングそのものが初心者である人向けではないかもしれない. な…

C++の配列・STLコンテナで区切り文字を入れてostreamに出力する

C++

はじめに C++において,たまに std:cout や std:ofstream, std::ostringstream といった出力ストリームに,配列や std::vector の要素を何かの区切り文字を入れて出力したいことがある. この「区切り文字を入れて出力」というのは少々面倒で,末端要素の後…

Range-based forで逆順走査したい

C++

はじめに C++を書いていると,Range-based forで逆順操作をしたいことがたまにある. Range-based forは順方向の走査のみで,逆順に走査することはできない. なので,通常のインデックスベースのforを用いて, std::vector<int> v{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}</int>…

C++のラムダで再帰する

C++

はじめに C++において,ラムダで再帰したいと考えることはたまにある. この記事ではラムダで再帰する手法をいくつか紹介する. 例として扱う再帰関数はフィボナッチ数列の関数(もっとも単純な実装)とする. int fib(int n) noexcept { return n < 2 ? n :…

タブ番号,バッファ番号,ウィンドウ番号,ウィンドウIDの相互変換

Vim

はじめに 先日,「Vimで既に対象バッファを開いているウィンドウがあるとき,そのウィンドウに移動する」と「Vimのタブ番号,ウィンドウ番号,ウィンドウID,バッファ番号の一覧情報を表示する」の2記事で,タブ番号,バッファ番号,ウィンドウ番号,ウィン…