しゅみぷろ読者になるしゅみぷろプログラミングとかこの広告は、90日以上更新していないブログに表示しています。Unityはじめに以前、id:i-saintさんとid:hecomiさんの記事を参考にUnityでCommandBufferを使ったRaymarchを試しました。こちらの記事で紹介させていただいています。esprog.hatenablog.com今回はCommandBufferを使わないRaymarchingについてです。きっかけはこちらのリプライ。ビューにも出るし影出すのも簡単なはずです。2016この後も数件とても参考になるリプライを頂きました。ありがたや・・・ということで、CommandBufferを使わないオブジェクトスペースのRaymarchingを試してみました。id:i-saintさんの以下の記事を参考にさせて頂きました。i-saint.hatenablog.com本記事では、以前作ったCommandBufferを使ったRaymarchingを元にどういった部分に手を入れたのかをメモしていこうと思います。リポジトリは以下で公開しています。github.comオブジェクトスペースのRaymarching実装カメラに描画されるメッシュ(オブジェクト)の表面位置からRayを飛ばすことで実現します。頂点シェーダーを以下のように修正し、通常のオブジェクトを描画するのと同じように座標変換するようにしました。o;プリプロセッサディレクティブで分岐しているのですが、「OBJECT_SPACE_RAYMARCH」が定義されている場合、オブジェクトスペースでRaymarchを行うようにしてあります。これはPropertiesで次のように定義しているため、マテリアルから変更が可能です。0}1つだけ実装で躓いたのが、なぜか発生する「歪み」です。レンダリングされた画像が歪んでいるのがわかるでしょうか?原因は視錐台内部の頂点を正規化デバイス座標の範囲内に移す際の、w成分による除算タイミングを勘違いしていたことでした。射影空間にある頂点座標をwで割ることにより「頂点をスクリーンに投影するための立方体の領域(-1≦x≦1、-1≦y≦1、0≦z≦1)に納める」事ができます。重要なのは「頂点シェーダーを抜けた頂点はそこで初めてwで割り算され、スクリーンの投影位置が確定する」ということです。o;}となっています。出力されたscreenをRayの方向を決めるために使っているのですが、この値はデバイス座標に正規化されていません。別途この処理を行う必要があります。そのため、フラグメントシェーダーで以下のように記述しました。i.screen.w;これで歪みが消えました。UnityでMatcapシェーダー書いたのでメモ。)はてなブログをはじめよう!es_programさんは、はてなブログを使っています。ブログを報告する引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。