2009/03/14

サイト移行

現在ブログ移行作業中です。
だんだん出来上がってきたので、こちらからのリンクを張りたいと思います。

移行先
http://whiteoutput.sitemix.jp/

2009/03/02

HLSLってなんだ!

ども。お久しぶりです。

近況を話します。
現在、学校が春休みに入り、のんびり休日ライフを満喫中です。

ということで、コーディングしてます。
はい。休日でもコーディングしてます。
最近。XNAでゲームを作っていまして、まあ、3Dとか無理なんで、2Dなんですけど。
そこで、GPU側のプログラムができるということにたどり着いて。
Programmable Shaderとかがあるらしいです。
現在、それを記述する言語である、HLSL(High Level Shader Language)をチョコチョコと勉強中です。

さて、このHLSLなんですが。

正直言ってよくわからない。

です。

昔は、アセンブリで書かなくてはならなかったので、それに比べればましなんでしょうが。
3Dの基礎がないですからね。その辺はさっぱりです。UV座標とか、フォグとか、法線ベクトルとか、よくわかりません。

それでも、ピクセルシェーダーぐらいは何とかわかりそうな気がするので、それをいじっています。
どうやら、あるピクセルを描画される情報を与えられ、入力された情報からそのピクセルの色を決める。
みたいなことをするのが、ピクセルシェーダーみたいです。

まあ、これ打っている間にいろいろ調べるんだがな、だんだんわからなくなっていくんだ。

さあ、気を取り直して。とりあえず、指定した色を透過させるプログラムを書いてみたよ。


uniform extern texture ScreenTexture;

sampler ScreenS = sampler_state
{
Texture = <ScreenTexture>;
};

float3 mask;

float4 PixelShaderFunction(float2 texCoord : TEXCOORD) : COLOR
{
float4 color = tex2D(ScreenS, texCoord);
if(any(color.rgb - mask)) return color;
else return float4(1.0, 0, 0, 0);
}

technique
{
pass p0
{
PixelShader = compile ps_2_0 PixelShaderFunction();
}
}


解説とか、勘弁してくれよ。



any(x)は、xのいずれかの要素が、0以外なら真が返ってくる関数らしい。

もちろんmaskには、指定された色が入っている。



よくわからないけど、うん。勉強するよ。

・・・本でも買ってこようか・・・。

2009/02/14

カウンター製作日記 #2


サーバーの都合で設置できていないが。
ということで、ここですこし中身をさらしてみる。

全体の流れとして、こんな感じになっている。
データベースから、値を読み込む。

今日、一度目の訪問かチェック。一度目なら、カウントアップ

XMLで出力。

そして、登録制にしていて、いくつかのカウンタを作ることができる仕様。
ところどころに出てくるIDは、ユーザーID的なもの。

まずは最後のXML出力で、XMLSerializer使ったあたり。XML出力は、betaだけどこれが一番楽。

$options = array(
'indent' => "\t", //インデントに使う文字
'encoding' => 'utf-8', //エンコーディング
'rootName' => 'counter', //ルートの要素名
'rootAttributes' => array( //ルートの属性
'id' => $this->id
),
'addDecl' => true, //<?xml version="1.0"?>タグを付けるか
'returnResult' => true //serializeメソッド実行時にXMLを返すか
);
//str_pad(文字列, 文字数, 文字, オプション);
//指定された文字数になるまで、文字列に文字を追加する。
//STR_PAD_LEFTは、左側を文字で埋める、という意味。
$output = array(
'count' => str_pad($this->count, $this->digit, '0', STR_PAD_LEFT),
'today' => str_pad($this->today, $this->digit, '0', STR_PAD_LEFT),
'yesterday' => str_pad($this->yesterday, $this->digit, '0', STR_PAD_LEFT)
);
$serializer = new XML_Serializer($options); //オプションを指定して、XML_Serializeを作成
return $serializer->serialize($output); //配列をXMLで出力



こんな感じに実装している。

$this->countと$this->todayと$this->yesterdayは、名前のとおりのカウント数が入っている。


はずであったが、todayとyesterdayはまだ未実装。



$this->idは、受け取ったIDを出力しているだけ。



つぎに、「今日一度目の訪問」あたり、PEAR/Dataで翌日0時のUNIX時を取得する。




$d = new Date();
$d->hour = 0;
$d->minute = 0;
$d->second = 0;
$d->partsecond = 0.0;
return $d->getNextDay()->getTime();



うん。そのままだね。

時間、分、秒、を0にして、翌日を取得している。



最後に、カウントアップSQL。




UPDATE counter SET count = count + 1 WHERE MD5(id) = ?



MySQL前提で考えているのだが、こんな感じ。

SQLでカウントアップもしてしまおうという魂胆。


オーバーフローとか考えるのが面度かった。



 



最近、ねたはあるのだが、書く時間と気力がない・・・。

2009/01/31

Googleがばぐった。

本日、ついにGoogleが末期のようです。

20090201000540

20090131235741

カウンター製作日記 #1

今回は、このブログにカウンターをつけよう、ということらしい。
検索中・・・「よさげなカウンター」・・・・・・・・・・・検索結果:当該件数0件
と、いうことで、カウンターを作ってみることにした。

まず、どんなカウンターを作るのか?
現在考えているものとしては、PHPでいろいろな処理して、Flexで表示をするというもの。

ただね、例のサーバーのPHPがしょぼいからいろいろ大変です・・・。

2009/01/21

浮動小数点の指数部

どもども。今回はプログラムねたです。

C#での浮動小数点型であるdoubleから指数部を取り出す企画です。
まず、doubleの定義から。doubleは64bitで表す倍精度浮動小数。
今回は、一般的なIEEEで定められているIEEE754の場合。(ほかの場合は聞いたことがないが)

|符号部 S|指数部 E|小数部 F|
|  1bit      |  11bit      | 52bit     |

で表す。実際の値は、
equation 
こんな感じになる。

さて、いよいよC#で指数部を取り出す方法だが、値をビット演算したいのでdoubleのままじゃ困る。そんなとき。これを使えばいい。

BitConverter.DoubleToInt64Bits メソッド
http://msdn.microsoft.com/ja-jp/library/system.bitconverter.doubletoint64bits.aspx

ってなわけで、指数部を取り出すプログラム。メソッドにしてみた。

public int doubleExponate(double value){
//doubleをlongに
long bits = BitConverter.DoubleToInt64Bits(value);
//指数部を取り出す
long exponate = (bits >> 52) & 0x7ff;
//-1023
exponate -= 1023;
return (int)exponate;
}



こんな感じ。



ちなみにこれやってて初めて気づいたんだが、

equation (1)


となるらしい、Eって常用対数なのね、自然対数だとばかり思っていた。



今日はこんな感じで、でわでわ。

2009/01/16

滑ってきました。

1/10~1/12にスノーボードしに雪山ってきました。

スキー場は、白馬コロチナ国際スキー場というところです。

3日間行ってきたのですが、1日目、雪、2日目、晴れ、3日目、雪とかなり恵まれたコンディションでした。

ということで、2日目に頂上で撮った景色をあげときます。

Image001

ではでは。