トップページ > 記事閲覧
キューブマップテクスチャーにぼかしをかけたいのですが。。。
名前:初心者 日時: 2015/03/11 00:52

動的にキューブマップにぼかしをかけるにはどうしたらいいでしょう。 GraphFilter()を使っても思い通りにフィルタをかけることができませんでした。 以下はまだ試していないので私の推測での話になりますが、 各面別々にブラーをかけるとおそらく継ぎ目ができたり、 立方体の隅の方のぼかしが小さくなってしまうと思います。 シェーダーを書いて角度ベースでぼかしをかけるのならば きっと正確な結果が出ると思いますが、カメラを覆うプリミティブを作ったり、 六面を描画する必要があったりとあまりスマートな方法とは思えません。 これ以外によい方法があったら教えてください。 (結果的にある程度妥協する必要があるかもしれませんが、もう少し選択肢がほしいです)
メンテ

Page: 1 |

Re: キューブマップテクスチャーにぼかしをかけたいのですが。。。 ( No.1 )
名前:管理人 日時:2015/03/11 23:28

6面を一つの大きな画像に描画して、それに対して GraphFilter でぼかし処理を行い、 ぼかした結果を各6面に転送する、というのを思いつきましたが、 解像度が高いと負荷が凄そうです・・・
メンテ
Re: キューブマップテクスチャーにぼかしをかけたいのですが。。。 ( No.2 )
名前:初心者 日時:2015/03/14 00:45

返信遅れてすみません! どうせぼかすのならば解像度なんて。。。とも思いますが その方法では隙間から背景色が漏れてしまうのではないでしょうか? ミップマップで解像度を落として線形補完をするといい感じにぼかせるという 手法を耳にしたのですが、DxLibでのミップマップレベルの増やし方がわからないのです。。。 (詳しくないのでよくわからないのですがミップマップ情報を含まないテクスチャでは ピクセルシェーダーでtex〜lodを呼んでも意味がないのでしょうか?) 話題がトピックからもDxLibからも離れていて ここで質問するべきではない気もしますが、回答いただけたら幸いです
メンテ
Re: キューブマップテクスチャーにぼかしをかけたいのですが。。。 ( No.3 )
名前:管理人 日時:2015/03/14 16:29

> どうせぼかすのならば解像度なんて。。。とも思いますが > その方法では隙間から背景色が漏れてしまうのではないでしょうか? 普通に考えるとキューブマップの6面分だけ「大きい画像」に描画しますが、 件の隙間の背景色の問題もあるので「大きい画像」を 18分割して、 以下のようにキューブマップの各面を配置します [ 無 ] [ -z ] [ 無 ] [ @0 ] [ +y* ] [ @1 ] [ -x* ] [ +z* ] [ +x* ] [ @2 ] [ -y* ] [ @3 ] [ -x ] [ -z* ] [ +x ] [ 無 ] [ +y ] [ 無 ] 無 : 特に何も描画しない箇所 @0 : 斜め半分を境に片方を +y 、片方を -x を配置 @1 : 斜め半分を境に片方を +y 、片方を +x を配置 @2 : 斜め半分を境に片方を -y 、片方を -x を配置 @3 : 斜め半分を境に片方を -y 、片方を +x を配置 * : GraphFilter 後にキューブマップに転送する箇所 その上で GraphFilter でぼかして、GraphFilter 後に右側に * が付いている箇所をキューブマップに転送します この方法でも @0 〜 @3 の箇所に隣接する部分の端が正しい結果になりませんが、真っ黒の背景色が あるよりは大分違和感の無い見た目になると思います > ミップマップで解像度を落として線形補完をするといい感じにぼかせるという > 手法を耳にしたのですが、DxLibでのミップマップレベルの増やし方がわからないのです。。。 DXライブラリには今のところミップマップを意図的に増やしたり減らしたりすることはできません 線形補間とは具体的にはどのような方法でしょうか? 単純にテクスチャの解像度を下げた後に線形補間で元の解像度に拡大してぼかし効果を得る、ということでしたら GraphFilter の DX_GRAPH_FILTER_DOWN_SCALE で縮小して、拡大は SetDrawMode( DX_DRAWMODE_LINEAR ) ; を設定した後に DrawExtendGraph で拡大描画するという方法でミップマップを使用しなくても 同じような効果が得られそうですが・・・
メンテ
Re: キューブマップテクスチャーにぼかしをかけたいのですが。。。 ( No.4 )
名前:初心者 日時:2015/03/15 00:28

返信ありがとうございます > その上で GraphFilter でぼかして、GraphFilter 後に右側に * が付いている箇所をキューブマップに転送します > この方法でも @0 〜 @3 の箇所に隣接する部分の端が正しい結果になりませんが、真っ黒の背景色が > あるよりは大分違和感の無い見た目になると思います 転送しないマップもぼかす画像に配置する方法、素晴らしいと思います。是非使わせていただきます。 が、二つほど質問させてください。 1.斜めに画像を設置するには三角形のマスク画像を作らなくてはいけないのでしょうか? 2.拡大縮小描画を行わない限り大きい画像のサイズは二のべき乗になりませんが、左右の-x,+x面は背景色が漏れ出ることはないのでしょうか? (リファレンスによると二のべき乗サイズでない画像のぼかしは色がにじむことになっていますが修正されたのでしょうか?) 解説お願いします。 ミップマップを使いたいと思った理由は、ぼかしたマップで疑似的なイメージベースドライティングを行いたかったからです。 (疑似的、といっても観測点(六面マップの撮影位置)をカメラ位置で近似するというだけで他は一般的なIBLと同じことをするつもりですが) その中で、スペキュラ項のぼかしサイズをマテリアルパラメータで指定できたらいいなと思っていました。 C++側でぼかしたマップを渡すだけではぼかしレベルに応じた多数のテクスチャを渡す必要がありますが、 ミップマップを利用すればマテリアルパラメータに基づいてシェーダーからミップマップレベルを指定することによって、 ぼかしサイズを(段階的とはいえ)自由に変えられると思ったのです。(段階数を増やすのも渡すテクスチャのミップマップを増やすだけで簡単です) ですが、ミップマップを増減できないのであれば仕方がありません。 スペキュラのぼかしはシェーダーで重み付平均を使うとして、ディフューズの計算には先ほどの『18分割ぼかし』方法を使わせていただくとします。 (一面のサイズを超えるぼかしサイズでは破たんしてしまいますがそこまでぼかさないようにすれば大丈夫でしょう) ところで、このトピックで何度か上がっているGraphFilter関数ですが、直接キューブマップを扱うことには対応していないのでしょうか。 数種類しか試していないのであやふやなのですが、フィルターをかけても一面目におかしな結果が表示され、他の面には変化がないという状況のようです。 ガウスフィルタはほかのテクセルを参照する必要があるためしょうがない(できてたらこのトピを書いていませんね)と思いますが、 反転やモノトーン、縮小(これはサイズの違うキューブマップを作って試しました)も正しい結果にならないのは直感的ではないと思います。 キューブマップ自体比較的新しい機能のようですし管理人さんもお忙しいとも思いますが是非修正(実装、になるのでしょうか?)お願いしたいと思います。 これはあくまで現象報告であり、クレームをつけるつもりは毛頭ございませんのでお気を悪くさせてしまったならば謝罪します。
メンテ
Re: キューブマップテクスチャーにぼかしをかけたいのですが。。。 ( No.5 )
名前:管理人 日時:2015/03/16 03:12

> 1.斜めに画像を設置するには三角形のマスク画像を作らなくてはいけないのでしょうか? DrawPolygon2D という関数を使用すると三角形に画像を描画することができます #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int texhandle ; VERTEX2D Vert[ 3 ] ; ChangeWindowMode( TRUE ) ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) return -1; // テクスチャを読み込む texhandle = LoadGraph( "Tex1.bmp" ) ; // 1ポリゴン分の頂点のデータをセットアップ Vert[ 0 ].pos = VGet( 0.0f, 0.0f, 0.0f ) ; Vert[ 0 ].rhw = 1.0f ; Vert[ 0 ].dif = GetColorU8( 255,255,255,255 ) ; Vert[ 0 ].u = 0.0f ; Vert[ 0 ].v = 0.0f ; Vert[ 1 ].pos = VGet( 256.0f, 0.0f, 0.0f ) ; Vert[ 1 ].rhw = 1.0f ; Vert[ 1 ].dif = GetColorU8( 255,255,255,255 ) ; Vert[ 1 ].u = 1.0f ; Vert[ 1 ].v = 0.0f ; Vert[ 2 ].pos = VGet( 0.0f, 256.0f, 0.0f ) ; Vert[ 2 ].rhw = 1.0f ; Vert[ 2 ].dif = GetColorU8( 255,255,255,255 ) ; Vert[ 2 ].u = 0.0f ; Vert[ 2 ].v = 1.0f ; // 2Dの1ポリゴンの描画 DrawPolygon2D( Vert, 1, texhandle, TRUE ) ; // キー入力待ち WaitKey() ; // DXライブラリの後始末 DxLib_End(); // ソフトの終了 return 0; } 頂点データを用意しなければならないので DrawExtendGraph 等に比べると面倒ですが・・・ > 2.拡大縮小描画を行わない限り大きい画像のサイズは二のべき乗になりませんが、左右の-x,+x面は背景色が漏れ出ることはないのでしょうか? うっかりしていました、確かにご指摘の通りです・・・となるとこのように 30分割に・・・? [ 無 ] [ 無 ] [ -z ] [ 無 ] [ 無 ] [ 無 ] [ @0 ] [ +y* ] [ @1 ] [ 無 ] [ -z ] [ -x* ] [ +z* ] [ +x* ] [ -z ] [ 無 ] [ @2 ] [ -y* ] [ @3 ] [ 無 ] [ 無 ] [ -x ] [ -z* ] [ +x ] [ 無 ] [ 無 ] [ 無 ] [ +y ] [ 無 ] [ 無 ] うーんちょっと現実味が無くなってきました・・・ 一番端の背景色が漏れ出るのを防ぐための部分はぼかしサイズ次第で小さくすることができるので、 その辺りで調整すればまだ何とかなるかもしれませんが・・・ > (リファレンスによると二のべき乗サイズでない画像のぼかしは色がにじむことになっていますが修正されたのでしょうか?) いえ、現在もリファレンスにある通りです > ミップマップを使いたいと思った理由は、ぼかしたマップで疑似的なイメージベースドライティングを行いたかったからです。 ご解説ありがとうございます 因みに Direct3D 9 の場合は描画対象にできるテクスチャでミップマップを使用することはできませんので、 リアルタイムにレンダリングした結果をキューブマップに使用する場合は多数のテクスチャを ピクセルシェーダーで使用するという方法しかないと思います( 若しくは大きなテクスチャに複数の ミップマップレベルの画像を配置してピクセルシェーダーで読み取る座標を操作すれば1枚のテクスチャで 擬似的にミップマップを使用することはできそうですが・・・ ) > ところで、このトピックで何度か上がっているGraphFilter関数ですが、直接キューブマップを扱うことには対応していないのでしょうか。 すみません、今のところキューブマップは色々な機能に正式に対応していません GraphFilter に対応しようと思いますが、ここ1週間ほど掛けて行っていた変更による不具合の修正も しなければならず少し日数が掛かりそうです、申し訳ありませんが暫くお待ちください m(_ _;m
メンテ
Re: キューブマップテクスチャーにぼかしをかけたいのですが。。。 ( No.6 )
名前:初心者(解決) 日時:2015/03/16 18:28

うーん・・・ ではぼかしは使用せずに、縮小したテクスチャをピクセルシェーダーに渡して参照するときに周囲のテクセルと平均をとって・・・ ぼかしサイズにかかわらず参照するテクセル座標の数を固定にすれば無駄に重くなることはなくなると思いますが・・・ 結構汚いソースになってしまいそうです。。 ですが大腿方向性は決まりました。解決とさせていただきます
メンテ
Re: キューブマップテクスチャーにぼかしをかけたいのですが。。。 ( No.7 )
名前:管理人 日時:2015/03/23 00:07

キューブマップに対して正常に GraphFilter が行われるようにしてみようとしたのですが、 キューブマップへの書き込みはキューブの各6面に対して2D画像としてアクセスすることが できるのに対して、読み込みはキューブマップとして3D座標を用いた参照しかできないようで、 想定していたような各6面に対して GraphFilter の効果を反映させるということは 困難だということが分かりました 各6面を一度通常の2Dテクスチャに転送した上でフィルター処理に使用するという方法を 採れば可能なのですが、MakeScreen で作成した画像に対してフィルター処理を行った後に キューブマップの各面に DrawGraph で書き込む場合より何倍も遅いので、あまり実用的ではありません・・・ なので、ひとまずはキューブマップに対する GraphFilter は正常に動作しないという現状の 仕様のままにしようと思います m(_ _;m
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存