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
2009/01/21
浮動小数点の指数部
どもども。今回はプログラムねたです。
C#での浮動小数点型であるdoubleから指数部を取り出す企画です。
まず、doubleの定義から。doubleは64bitで表す倍精度浮動小数。
今回は、一般的なIEEEで定められているIEEE754の場合。(ほかの場合は聞いたことがないが)
|符号部 S|指数部 E|小数部 F|
| 1bit | 11bit | 52bit |
さて、いよいよ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;
}
こんな感じ。
ちなみにこれやってて初めて気づいたんだが、
となるらしい、Eって常用対数なのね、自然対数だとばかり思っていた。
今日はこんな感じで、でわでわ。