トップページ > 記事閲覧
テクスチャとしてのマスク
名前:rose 日時: 2015/01/12 20:34

いつもお世話になっております。 二つほど質問をさせてください。 一つ目に、モデルを描画する際、マスク処理をテクスチャに反映させる、 またはそれに近い結果を得ることは可能でしょうか。 ただし、条件として ・テクスチャはリピート数が2以上 ・通したいマスク処理はリピートしない つまり、「あ」という文字が一つ書かれたテクスチャをリピート数2で描画した場合 ああ ああ これを、右半分が白、左半分が黒のマスク画像を通した場合・・ ああ ああ ■□ ■□ ↓  あ  あ という描画結果が理想です。 マスク用画像をシェーダーに渡し、その色を参考にしてテクスチャを透明にすることは できました。しかし、リピートさせたことによりマスクもリピートしてしまい、上の画像 でいうと、「あ」が半分になったものが4つ描画された、という状態です。 二つ目に、MV1SetFrameTextureAddressTransform関数を使用してリピート設定を試して みたのですが、これによるテクスチャ座標の変化は、例えばサンプルに書かれている float2 TexCoords0 : TEXCOORD0 ; // テクスチャ座標 とは別の扱いでしょうか。 オリジナルシェーダーを有効にしたところMV1SetFrameTextureAddressTransform関数 での設定は反映されていなかったので・・ ただ、そもそも私がテクスチャ座標について勘違いしている可能性がとっても高いことと、 シェーダー側に値を直接渡せば解決する気がするので大して試してません・・
メンテ

Page: 1 |

Re: テクスチャとしてのマスク ( No.1 )
名前:管理人 日時:2015/01/13 01:24

> 一つ目に、モデルを描画する際、マスク処理をテクスチャに反映させる、 > またはそれに近い結果を得ることは可能でしょうか。 roseさんが試されている MV1SetFrameTextureAddressTransform関数を使う方法で 実現できると思います > 二つ目に、MV1SetFrameTextureAddressTransform関数を使用してリピート設定を試して > みたのですが、これによるUV座標の変化は、例えばサンプルに書かれている >  > float2 TexCoords0 : TEXCOORD0 ; // テクスチャ座標 >  > とは別の扱いでしょうか。 MV1SetFrameTextureAddressTransform関数で設定したUV座標の変化は 頂点シェーダーで行う必要があります MV1SetFrameTextureAddressTransform関数で設定したUV座標の変化は 頂点シェーダーではテクスチャ座標変換行列として存在しています そのテクスチャ座標変換行列が定数番号の何番に割り当てられているかは 関数リファレンスのLoadVertexShader関数の解説に書かれています http://homepage2.nifty.com/natupaji/DxLib/function/dxfunc_3d.html#R17N2 88〜89  テクスチャ座標変換行列の転置行列0( 3Dモデル描画時のみ有効 ) 90〜91  テクスチャ座標変換行列の転置行列1( 3Dモデル描画時のみ有効 ) 92〜93  テクスチャ座標変換行列の転置行列2( 3Dモデル描画時のみ有効 ) サンプルプログラムコーナーの 「サンプルプログラム オリジナルシェーダーを使用した3Dモデルの描画基本 ( 要プログラマブルシェーダー2.0一部3.0 )」 ではテクスチャ座標変換行列を使用していませんでしたので、使用するコードに変更しました http://homepage2.nifty.com/natupaji/DxLib/program/dxprogram_3DModelShaderBase.html#R1N1 具体的には、定数定義の部分に cfTextureMatrix[ 3 ][ 2 ] が加わります // C++ 側で設定する定数の定義 float4 cfProjectionMatrix[ 4 ] : register( c2 ) ; // ビュー  → 射影行列 float4 cfViewMatrix[ 3 ] : register( c6 ) ; // ワールド → ビュー行列 float4 cfLocalWorldMatrix[ 3 ] : register( c94 ) ; // ローカル → ワールド行列 ↓ // C++ 側で設定する定数の定義 float4 cfProjectionMatrix[ 4 ] : register( c2 ) ; // ビュー  → 射影行列 float4 cfViewMatrix[ 3 ] : register( c6 ) ; // ワールド → ビュー行列 float4 cfTextureMatrix[ 3 ][ 2 ] : register( c88 ) ; // テクスチャ座標操作用行列 float4 cfLocalWorldMatrix[ 3 ] : register( c94 ) ; // ローカル → ワールド行列 そしてテクスチャ座標を出力構造体にセットするコードがただの代入ではなく行列の 計算結果を代入するものに変わります // テクスチャ座標をセット VSOutput.TexCoords0 = VSInput.TexCoords0 ; ↓ // テクスチャ座標変換行列による変換を行った結果のテクスチャ座標をセット VSOutput.TexCoords0.x = dot( VSInput.TexCoords0, cfTextureMatrix[ 0 ][ 0 ] ) ; VSOutput.TexCoords0.y = dot( VSInput.TexCoords0, cfTextureMatrix[ 0 ][ 1 ] ) ; よろしければお試しください m(_ _)m
メンテ
Re: テクスチャとしてのマスク ( No.2 )
名前:rose(解決) 日時:2015/01/13 03:05

おお・・なんだか一気に理想の結果を得ることができました。 いままでこの処理ができず、マスク処理をしたことを前提としたテクスチャを 作製し代用していました。 しかし、数十回リピートしたようなテクスチャでは当然解像度的に限界があり、 またモデリングソフトから移す際にもかなり時間がかかり苦労していました・・ 大変勉強になりました。有難うございます(_ _)
メンテ

Page: 1 |

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

   クッキー保存