現在地メニュー >> Cg >> Cg編05 >> Cg編05::ライティング3

フラグメントシェーダでのライティング


ライティングには、頂点単位でのライティングに加え、
フラグメント単位でのライティングも可能である。

必要な事は、フラグメントシェーダにピクセル単位での頂点座標を渡す事である。

【例】:vertex.cg
//入力頂点
struct VertexIn
{
	float4 position : POSITION;
	float3 color : COLOR;
	float3 normal : NORMAL;
};

//出力頂点
struct VertexOut
{
	float4 position : POSITION;
	float3 objePos : TEXCOORD0;//テクスチャとしてわたす
	float3 oNormal : TEXCOORD1;
};


//-------- 頂点シェーダメイン関数 ---------//
VertexOut CgVertexMain(in VertexIn input,
					   uniform float4x4 modelViewProj)
{
	VertexOut output;//出力用
	//位置は普通に変換
	output.position = mul(modelViewProj, input.position);
	
	output.objePos = input.position.xyz;
	output.oNormal = input.normal.xyz;

	return output;
}

一方フラグメントでは、
渡されたテクスチャ座標を使って頂点単位のライティングのような事を行えばよい。

//フラグメントの入力
struct FragmentIn
{
	float4 position : POSITION; //ラスタライズ用(使用しない)
	float3 objePos : TEXCOORD0; //テクスチャとして入ってきた座標
	float3 oNormal : TEXCOORD1; //テクスチャとして入ってきた法線
};

//フラグメントの出力
struct FragmentOut
{
	float3 color : COLOR;
};

//------- フラグメントライティングのルーチン -------------//
float3 calcFragmentLighting(FragmentIn input, 
				uniform float3 objEye,
				uniform float4 objLight)
{
	/*色計算 lit関数でもいいし直接計算してもよい*/
}
//--------- フラグメントシェーダメイン関数 ------------//
FragmentOut CgFragmentMain(in FragmentIn input,
					uniform float3 objEye,
					uniform float4 objLight)
{
	FragmentOut output;//フラグメント出力
	output.color = calcFragmentLighting(input,objEye,objLight);

	return output;
}

サンプルコード

目次

― その他 ―

Wiki内検索

計測中...(07.10.8〜)

Save The World






▲よろしければ広告のクリックもお願いします


▲ランキングに参加しました

管理人/副管理人のみ編集できます