C#は電気羊の夢を見るか?(引っ越し中)

dtiブログが閉鎖とのことでhttp://tanocs.blog.fc2.com/へ引っ越します。

ゲームクラスを切り替えて使う

Microsoft.Xna.Framework.Game.Run();のおせっかいにより見事に内部の値がお掃除されてしまう関係で、ゲームクラスを切り替えて使うのに妙に苦労したのでメモ。

■Program.cs
using System;

namespace WindowsGame1 {
public enum GameScene {
title,
prologue
}

static class Program {
public static GameScene? NextGameScene = GameScene.title;
static void Main(string[] args) {

while(NextGameScene != null) {
switch(NextGameScene) {
// タイトル
case GameScene.title:
using(GameTitle game = new GameTitle()) {
game.Run();
}
break;

// タイトル
case GameScene.prologue:
//using(GamePrologue game = new GamePrologue()) {
// game.Run();
//}
NextGameScene = null;
break;

// 存在しないシーンなら終了
default:
NextGameScene = null;
break;
}
}
}
}
}

■GameTitle.cs
Program.NextGameScene = GameScene.prologue;
としてやればどこからでも次シーンの変更が可能。

こうしてやることで、LoadContentをシーン毎に起こすことができるので、プログラムの最初に全部一気にメモリへコンテンツをぶち込むという荒業を行わなくて済む。

ただ、このままだとウィンドウが一回一回死ぬので、こいつを回避しなくちゃならない。
それはまた次回。
このエントリーをはてなブックマークに追加
LINEで送る

無知の知

知らないというのは恥ずかしいが、
知らないということを知らないのは、もうどうしようもない。

そういう時は、想像力を働かせて、きっとこういう感じのがここらへんに関数であるだろうとかって探すのだが、それの思いに至らなかった時は、もう知ってる人から見れば「うわ、何これ」という実装になるわけです。


今回やらかしたのはこれ

float a = max(min(1, n), 0);


別段、面倒とも思わずうっかり書いてしまっていました。
正解は

float a = saturate(n);


これ、HLSLでもXNAつかえるんだよね・・
どうせ忘れるからめもっとく。
このエントリーをはてなブックマークに追加
LINEで送る

かんたんモザイクシェーディング

散々苦労して作成した前回のモザイクに比べ、
おっそろしく簡単に、しかも高速に動作します。

■HLSL
float g_Square;

texture SceneTexture;
sampler SceneSampler : register(s0) = sampler_state
{
Texture = (SceneTexture);
MinFilter = Linear;
MagFilter = Linear;

AddressU = Clamp;
AddressV = Clamp;
};

float4 PS(float2 texCoord : TEXCOORD0) : COLOR
{
float2 tex_coord = floor( g_Square * texCoord + 0.5f) / g_Square;
return tex2D( SceneSampler, tex_coord );
}

technique Mosaic
{
pass P0
{
PixelShader = compile ps_2_0 PS();
}
}

■描画処理(スプライトバッチ)
mosaicEffect.CurrentTechnique = mosaicEffect.Techniques["Mosaic"];
mosaicEffect.Parameters["g_Square"].SetValue(100);

spriteBatch.Begin(SpriteBlendMode.None,
SpriteSortMode.Immediate,
SaveStateMode.None);

mosaicEffect.Begin();
mosaicEffect.CurrentTechnique.Passes[0].Begin();

spriteBatch.Draw(SourceRenderTarget.GetTexture(), Vector2.Zero, Color.TransparentWhite);
spriteBatch.End();

mosaicEffect.CurrentTechnique.Passes[0].End();
mosaicEffect.End();


g_Squareの値を大きくするとモザイクが細かくなります。
かなり簡単な実装で、前の苦労は一体なんだったんだ・・・と思うことしばし

XNAでモザイクのサンプルさがすと意外とないので掲載。
このエントリーをはてなブックマークに追加
LINEで送る

しらんがな(´・ω・`)

CSMもようやくギザギザ状態とおさらばし、これで仕上げだ!とばかりに
アンチエイリアスをONにすると、そこは真紫色の別世界だった。

なんじゃこりゃー!と調べていると、どうやらマルチレンダリングターゲットが原因ぽい。


モデルの転送回数が減らせるからこりゃ素晴らしい!ってあちこちに使ったのですが・・・

http://msdn.microsoft.com/ja-jp/library/bb975911%28XNAGameStudio.20%29.aspx

いずれのプラットフォームにおいても、MRT には次のような制約があります。
・MRT のレンダリング ターゲットは、すべてビット深度が同じでなければなりません
・どのサーフェスも、幅と高さが同じでなければなりません。
・アンチエイリアシングは使えません。

そんなん、しらんがな(´・ω・`)
このエントリーをはてなブックマークに追加
LINEで送る

 | HOME | 

PAGE TOP ▲

Appendix

■春条

■春条

生息地は愛知
車と甘い物が好きな31歳
特技は無限昼寝

MONOからSharpDXを使う
変態的な手法で、
.NET Frameworkを使わずに
ゲーム作りやってます。

Search

Calender

« | 2010-07 | »
S M T W T F S
- - - - 1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31

Twitter

Recent Entries

DTIブログポータルへ
このブログを通報
Report Abuse

利用規約