- 2007/06/08 10:49
- 未分類
調子に乗ってCgカテゴリ追加。
こうやって取りとめも無く追加していくと後で大変なことになる。。
ただ更新されないだけですがww
今日はシンプルなtextureシェーダ。
constantシェーダにtextureが貼れるだけ。
なんとなくcolorGainとcolorOffsetつけてみた。
あと昨日書くの忘れたけど、これはMayaのCgfxシェーダ向けの.cgfxシェーダです。
だからMaya以外での動作は未確認です。
Mayaの動作も基本的には保障しません。自己責任ということで、、
以下にソースコード↓
————————————————–
// un-tweakables //
float4x4 wvp : WorldViewProjection;
// tweakables //
float4 colorGain : Diffuse
<
string UIName = "Color Gain";
string UIWidget = "Color";
> = { 1.0f, 1.0f, 1.0f, 1.0f };
float4 colorOffset : Diffuse
<
string UIName = "Color Offset";
string UIWidget = "Color";
> = { 0.0f, 0.0f, 0.0f, 1.0f };
texture colorMap : Diffuse
<
string ResourceName = "nvidia1.dds";
string ResourceType = "2D";
>;
sampler2D colorMapSampler = sampler_state
{
Texture =
MinFilter = LinearMipMapLinear;
MagFilter = Linear;
};
// struct //
struct appdata
{
float4 position : POSITION;
float4 normal : NORMAL;
float2 coord : TEXCOORD0;
};
struct vertexOutput
{
float4 color : COLOR0;
float4 position : POSITION;
float2 coord : TEXCOORD0;
};
// vertex shader //
vertexOutput vertex( appdata IN )
{
vertexOutput OUT;
OUT.color = float4( 0f, 0f, 0f, 1.0f );
OUT.position = mul( wvp, IN.position );
OUT.coord = IN.coord;
return OUT;
}
// fragment shader //
float4 fragment( vertexOutput IN ) : COLOR
{
float4 color = tex2D( colorMapSampler, IN.coord );
color = color * colorGain + colorOffset;
return color;
}
technique texture
{
pass
{
VertexProgram = compile arbvp1 vertex();
FragmentProgram = compile arbfp1 fragment();
DepthTestEnable = true;
DepthMask = true;
DepthFunc = LEqual;
}
}
————————————————–
nvidia1.ddsというのはシェーダと同階層においてあるテクスチャファイル。
ddsとはdirectXで使われる形式だそうで。
こいつは正常に動くんだけど、最初にコンパイルしたものはなぜか
画面いっぱいにテクスチャが広がってしまいました。
何故かというと座標系がおかしかったから。
なので、OUT.position = mul( wvp, IN.position );を実行して、
座標系を変更。
これはえーと、、なに座標系っていうんだろう。
WorldViewProjectionはModel*View*Projectionってことらしいので、
この操作は射影変換、ってことでいいのかな。
気づけば昨日のlambertでもやっている。
なんだ、そういうことか。
ちなみにここでOUT.position = IN.position;としてしまうと、
こうなる↓

これは上に貼り付けてある玉と全く一緒のデータ。
別にこういう形状、というわけではない。
それと、OUT.position = mul( world, IN.position );のように、
world座標に変換してもほぼ同じことになる。
ただしworld座標だとスケールの値が評価されるために、スケールによって表示は変わる。
大きくなったり小さくなったりするだけだけど。
まぁでも、だんだんわかってきた。かな?
といってもまだルール的なところでよくわかんないところも多いんですけど。
inputもoutputもstruct用意しないといけないのか、とか。
まぁその辺は追々確認します。
- Newer: ごて
- Older: [ Cg ] lambert
Comments:0
Trackbacks:0
- Trackback URL for this entry
- http://blog.taikomatsu.com/2007/06/08/cg-texture/trackback/
- Listed below are links to weblogs that reference
- [ Cg ] texture from memlog