C#
3D 描画を行うゲームのスクリーンショットを撮っていたら 3D モデルが一部描画されずに困っていました。
RenderTarget2D のコンストラクタのオーバーロードに以下のようなものがあります。
深度バッファを使う時には以下のコンストラクタのオーバーロードを使います。
参考:[ひにけにXNA] XNA Game Studio 4.0におけるRenderTargetの変更点
RenderTarget2D のコンストラクタのオーバーロードに以下のようなものがあります。
new RenderTarget2D(GraphicsDevice graphicsDevice, int width, int height);これで生成されるレンダーターゲットには深度バッファがないために、3D モデルが正常に描画されない場合があります。
深度バッファを使う時には以下のコンストラクタのオーバーロードを使います。
new RenderTarget2D(GraphicsDevice graphicsDevice, int width, int height, bool mipMap, SurfaceFormat preferredFormat, DepthFormat preferredDepthFormat);preferredDepthFormat に深度バッファの種類を指定することで深度バッファのあるレンダーターゲットを生成できます。
参考:[ひにけにXNA] XNA Game Studio 4.0におけるRenderTargetの変更点
解決したけど原因はよくわからない。忘れないように書いておく。というか忘れてた。
Visual Studio 2010 で発生しました。
確認してみたところ Visual Studio 2012 RC でも同様です。
アセンブリ Foo に XAML ファイルがあり、同じアセンブリ内の名前空間 BarNS 内にカスタムクラス Bar があるとする。
clr-namespace:(名前空間名);assembly=(アセンブリ名)
のようにして XML 名前空間を指定すればいいようなので指定します。
しかし、ビルドすると
「省略できます」と書いてるんだから省略してもしなくてもどちらでもいいはずですが、省略してみます。
なんででしょうかねぇ。
Visual Studio 2010 で発生しました。
確認してみたところ Visual Studio 2012 RC でも同様です。
アセンブリ Foo に XAML ファイルがあり、同じアセンブリ内の名前空間 BarNS 内にカスタムクラス Bar があるとする。
namespace BarNS { public class Bar : ContentControl { public Bar() { // ごにょごにょ } // ごにょごにょ } }MSDN の XAML 名前空間および WPF XAML の名前空間の割り当て によると、
clr-namespace:(名前空間名);assembly=(アセンブリ名)
のようにして XML 名前空間を指定すればいいようなので指定します。
<Bar xmlns="clr-namespace:BarNS;assembly=Foo" />こうするとデザイナでは問題なく動いています。
しかし、ビルドすると
タグ 'Bar' は、XML 名前空間 'clr-namespace:BarNS;assembly=Foo' にありません。
とか言われます。
ここで、先ほどの MSDN のページを見直すと
assembly は、参照される clr-namespace がカスタム クラスを参照しているアプリケーション コードと同じアセンブリ内で定義されている場合は省略できます。
とあります。とか言われます。
ここで、先ほどの MSDN のページを見直すと
assembly は、参照される clr-namespace がカスタム クラスを参照しているアプリケーション コードと同じアセンブリ内で定義されている場合は省略できます。
「省略できます」と書いてるんだから省略してもしなくてもどちらでもいいはずですが、省略してみます。
<Bar xmlns="clr-namespace:BarNS;assembly=" />または
<Bar xmlns="clr-namespace:BarNS" />すると、ビルドできました。
なんででしょうかねぇ。
ラムダ式についてなぜか微妙に勘違いしていたのでメモ。
キャラクターを表すクラスにキャラクターの位置を表す Position 、キャラクターの1回の移動量を返す getMovement というメンバ変数がある。
using System; using Microsoft.Xna.Framework; class Character { public Vector2 Position { get; set; } private Func<Vector2> getMovement; public Character() { getMovement = () => new Vector2(1, (float)Math.Sin(Position.X)); } public void Update() { Position += getMovement(); } }
メインループで Update を実行すると getMovement の内容に応じて Position が変化する。
そして勘違いしていたのは getMovement のラムダ式で Position を使っている部分。
ここで Position は getMovement への代入時の値がそのままで Position が変わってから getMovement を実行しても同じ結果が返ってくると思ってた。
別にそんな事はなかった。
遅延評価って難しい。
少し前にSONYがGO FOR ITというソフトウェアスペシャリスト認定コンテストを開催しました
http://www.sony.co.jp/SonyInfo/Jobs/newgrads/sus/go_for_it.html
僕は応募資格を満たしていなかったので応募していないですが 、面白そうだったのでこの問題の一つ
人生の時計を解いてみました。続きを読む
http://www.sony.co.jp/SonyInfo/Jobs/newgrads/sus/go_for_it.html
僕は応募資格を満たしていなかったので応募していないですが 、面白そうだったのでこの問題の一つ
人生の時計を解いてみました。続きを読む