1

XNAプログラミングを始めたばかりで、「。x」モデルからテクスチャにアクセスする方法を理解できませんでした。カスタムシェーダーを使用して、フィルターがポイントに設定されたモデル(テクスチャがマップされた立方体のみ)を表示しています。これを行うには、モデルとは別にインポートする必要のあるテクスチャファイルのエフェクトを渡す必要がありました。そうしないと、モデルにも含まれているため、文句を言います。これは私が望むように完全に機能しますが、独自のテクスチャを持つ多くの異なるモデルがある場合、これは実際には適切な方法ではありません。

私の質問は:

モデルに含まれているテクスチャにモデルから直接アクセスして、シェーダーに送信するにはどうすればよいですか?または、HLSLを使用して直接アクセスできますか?

私が試したこと:

私はそれがテクスチャ変数に割り当てることができると言っている投稿を見つけました:

Texture2d texture = ((BasicEffect)model.Meshes[0].Effects[0]).Texture

これを試したところ、ゲームは実行されましたが、立方体は真っ黒です。テクスチャ変数が情報を保持していて正しいサイズであることがわかりますが、実際の画像を正しく保持しているかどうかはわかりません。私がちょうどBasicEffectそれらを使用したとき、それらはそれらのテクスチャーでうまくレンダリングされました。

アップデート:

少しいじった後、これを機能させることができました。私のゲームは数百の同じ立方体に読み込まれ、それぞれを作成すると、上記のコードを使用してモデルのテクスチャを保存し、メッシュパーツを調べて、効果をカスタム効果に変更しようとします。最初に作成されたキューブはテクスチャを問題なく保存できることを発見しましたが、その後に作成されたキューブは、BasicEffectとしてキャストできないと文句を言います。これにより、1つのテクスチャキューブが作成され、次に多くの黒いキューブが作成されました。同じモデルを何度も再利用すると、キューブの最初のインスタンスで実行されたカスタム効果を使用するように変更されたモデルが使用されると思います。これは正常ですか?テクスチャ変数を静的に変更することで、それらすべてをテクスチャとしてレンダリングすることができます。

4

2 に答える 2

1

モデルのテクスチャを一時的なTexture2D変数に割り当てており、現在メッシュに関連付けられているエフェクトに存在するテクスチャを設定していないことに注意してください。次の場合:

Texture2D textureToSet = Content.Load<Texture2D>("MyTex");

//Keep in mind that this method requires a basic effect type and that only one 
//effect is present on each mesh to work properly.
foreach(Mesh mesh in model.Meshes)
{
    ((BasicEffect)(mesh.Effects[0])).Texture = textureToSet;
}

foreach内で起こっている風変わりなことは、単にエフェクトを取得し、それをBasicEffectにキャストし、そのTextureプロパティを使用して、使用時に描画する新しいテクスチャを与えることです。詳細な紹介については、ドキュメントShawnのブログを参照してください。

于 2012-10-02T07:17:06.590 に答える
1

私が次に使用してテクスチャを保存していたので、他の誰かがこれについて疑問に思っている場合:

Texture2d texture = ((BasicEffect)model.Meshes[0].Effects[0]).Texture

これは機能しますが、問題の原因となっているものに注意する必要があります。モデルの効果をデフォルトのBasicEffectから1つのインスタンスに変更すると、その後に作成されるモデルのインスタンスごとに変更されます。したがって、特定のモデルで初めてエフェクトを変更する前にのみ、上記のコードを使用できます。

後で、モデルからテクスチャやその他の情報を抽出する方法を正確に説明しているこの本を見つけました。SeanJamesによるXNA GameStudio4.0を使用した3Dグラフィックス-具体的には第2章

于 2012-10-14T07:32:32.277 に答える