Home > 未分類 > [ Cg ] texture

[ Cg ] texture

  • Posted by: tai
  • 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;としてしまうと、
こうなる↓

tex_w.jpg

これは上に貼り付けてある玉と全く一緒のデータ。
別にこういう形状、というわけではない。

それと、OUT.position = mul( world, IN.position );のように、
world座標に変換してもほぼ同じことになる。
ただしworld座標だとスケールの値が評価されるために、スケールによって表示は変わる。
大きくなったり小さくなったりするだけだけど。

まぁでも、だんだんわかってきた。かな?

といってもまだルール的なところでよくわかんないところも多いんですけど。
inputもoutputもstruct用意しないといけないのか、とか。

まぁその辺は追々確認します。

Comments:0

Comment Form
Remember personal info

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

Home > 未分類 > [ Cg ] texture

Return to page top