カテゴリー別アーカイブ: グラフィック

表示関連のプログラミング

Multi-Layer Weighted Blended Order-Independent Transparency

前回紹介したWeighted Blended OITは、ポリゴンの距離が離れすぎると半透明の重ね合わせが不自然になる問題があるため、それを解決する方法を考えてみました。
カメラからの距離でポリゴン(ピクセル)をレイヤ分けして描画、最後に遠くのレイヤから合成していくことで問題を解決します。同一レイヤ内にポリゴンが複数存在した場合は、Weighted Blended OITを利用してレイヤの代表値を1つ求めて、その値でレイヤ合成を行います。
レイヤ分けするためにはレイヤ数だけ繰り返し描画する必要がありますが、MSAAの機能を利用して1回の描画で行う方法を考案できたため、比較的簡単に実装できるようになっています(裏技的な使い方です)。

続きを読む Multi-Layer Weighted Blended Order-Independent Transparency

Weighted blended order-independent transparencyの実装

順番に依存しない半透明の描画技術(Weighted blended order-independent transparency)をDirectX11で実装してみました。
半透明を重ねて表示する場合遠くから順に描画する必要がありますが、この技術を使えば描画順序に関係なくソートした描画結果に似た結果が得られます。

続きを読む Weighted blended order-independent transparencyの実装

DirectX11アルファテストはどこへ? discard/clip命令とAlphaToCoverage

DirectX10以降、レンダリングステートからアルファテストがなくなり、シェーダーで同等(またはそれ以上)の処理が行えるようになっています。OpenGL3.0以降でもシェーダーで対応するようです。
シェーダーでアルファテストを行う方法、処理結果をまとめてみました。また、アルファテストを適用させた場所にも、アンチエリアス処理を行えるAlphaToCoverageという機能についても調べてみました。

AlphaToCoverageという機能は知っていたのですが、こんな便利な機能だとは知りませんでした……。

アルファテストとAlphaToCoverage

続きを読む DirectX11アルファテストはどこへ? discard/clip命令とAlphaToCoverage

VisualStudio2017(Windows10 DirectX OpenGL)で始める3Dプログラミング

今(2017年5月)Windows&C++で3DプログラミングするならDirectXかOpenGLだと思いますが、最新バージョン(DirextX12など)は、性能重視のため手軽にプログラミングができなくなっています。
なので古いバージョンで使えるものを調べて、プログラミングができる環境を作ってみました。
作成した環境は、OpenGL1.1、OpenGL4.5、DirectX9、DirectX11、DirectX12で、初期化と画面クリア、簡単なポリゴンの描画まで行っています。
VSプロジェクト、ソースコードを公開していますので、3Dプログラミングの参考にしてください。
記事最後にあるダウンロードボタンから取得できます。

続きを読む VisualStudio2017(Windows10 DirectX OpenGL)で始める3Dプログラミング

ライトプリパスレンダリング Part3 アンチエイリアス

アンチエイリアス処理を行います。MSAAによるAAを試しましたがうまくいかなかったため、ポストプロセス処理のAAであるSMAA(Enhanced Subpixel Morphological Antialiasing)を実装してみました。かなりいい感じです。ただ、輪郭線処理との相性が悪いため輪郭線描画は無効にしています。
ライトプリパスレンダリングのプログラム作成は、ここで一旦終了します。

SMAA 1x
SMAA 1x

続きを読む ライトプリパスレンダリング Part3 アンチエイリアス

ライトプリパスレンダリング Part2 光源計算&最適化

光源計算の処理と最適化を行います。点光源などの影響範囲が限定されている場合、計算が必要なピクセルを検出することで処理時間を短縮します。

左上:法線 右上:Specular 左下:最終結果 右下:Diffuse
左上:法線 右上:Specular 
左下:最終結果 右下:Diffuse

続きを読む ライトプリパスレンダリング Part2 光源計算&最適化

ライトプリパスレンダリング Part1

ライトプリパスレンダリングの基本的な処理を作成します。ジオメトリバッファの作成、光源計算、最終レンダリングの3つのパスでレンダリングします。それとこれまでに作成した、輪郭線とステンシルシャドウも組み込んでみます。

左上:法線 右上:Specular 左下:最終結果  右下:Diffuse
左上:法線 右上:Specular
左下:最終結果 右下:Diffuse&Shadow

続きを読む ライトプリパスレンダリング Part1

ライトプリパスレンダリング Part0

準備期間を終えて正式スタート。最初の課題は「ライトプリパスレンダリング」です。まずは、必要になりそうな処理、MRT(マルチレンダーターゲット)、G(ジオメトリ)バッファの生成、レンダリング結果をテクスチャとして使用、などを調査検証してみる。

左上:法線 右上:デプス⇒ワールド座標 左下:Diffuse 右下:輪郭線(赤)&影(青)
左上:法線 右上:デプス⇒ワールド座標
左下:Diffuse 右下:輪郭線(赤)&影(青)

続きを読む ライトプリパスレンダリング Part0

ジオメトリシェーダでステンシルシャドウ&最適化

ジオメトリシェーダでステンシルシャドウを実装してみます。以前(DX9など)はシャドウボリュームの生成が面倒でしたが、ジオメトリシェーダを使うことによって簡単にできそうです。それと、単純な実装ではピクセルシェーダの負荷が大きすぎるため、できるだけシャドウボリュームの描画を減らす最適化も同時に行います。

ステンシルシャドウ
ステンシルシャドウ

続きを読む ジオメトリシェーダでステンシルシャドウ&最適化

ジオメトリシェーダで輪郭線表示

ジオメトリシェーダを使って輪郭線を表示してみます。方法は法線方向への拡大&裏面描画ではなく、ポリゴンエッジに輪郭線をつけるかどうか判定し、エッジ(辺)に沿ってラインを描画します。

ジオメトリシェーダで輪郭線
ジオメトリシェーダで輪郭線

続きを読む ジオメトリシェーダで輪郭線表示