現在地メニュー >> GLSL >> GLSL編05
INDEX:GLSL編04 << GLSL編05 >> GLSL編06

varying変数


varyingという修飾子がついている変数は
  • 頂点シェーダ → 様々な頂点シェーダの出力(色、法線情報など)
  • フラグメントシェーダ → 頂点シェーダからわたされる入力(線形補間されている)
となる。

フラグメントライティング


ピクセル単位でライティングをする場合は、
  • 頂点シェーダから法線情報をうけとる
  • 頂点シェーダから[頂点→光源]へのベクトルをうけとる
という2つが必要。

頂点単位での法線情報、[頂点→光源]へのベクトルが
フラグメントシェーダではvarying変数で線形補間される。

あとは同じ。

【例】:glsl.vert
//varying変数
varying vec3 normal;//法線
varying vec3 vtoL;//視点座標系での頂点→光源のベクトル

//頂点シェーダ
void main(void)
{
	//投影変換 (モデルビュー * プロジェクション) * 頂点座標
	gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;

	////各種基本的なベクトルを計算
	normal = gl_NormalMatrix * gl_Normal;//法線を視点座標系にする
	vec4 V = gl_ModelViewMatrix * gl_Vertex;//視点座標系の頂点位置
	vtoL = gl_LightSource[0].position.xyz - V.xyz;//頂点→光源へのベクトル
}

【例】:glsl.frag
//varying変数
varying vec3 normal;//法線
varying vec3 vtoL;//視点座標系での頂点→光源のベクトル

//フラグメント
void main(void)
{
	////  ambientの計算  ////
	vec4 ambient = gl_LightSource[0].ambient * gl_FrontMaterial.ambient;

	////  diffuse計算  ////
	vec3 N = normalize(normal);//正規化
	vec3 L = normalize(vtoL);//正規化
	float NdotL = dot(N,L);
	vec4 diffuse = vec4( max(0.0,NdotL) ) * gl_LightSource[0].diffuse * gl_FrontMaterial.diffuse;

	////  specular計算(Bilnのモデルを使用)  ////
	vec3 H = normalize(gl_LightSource[0].halfVector.xyz);
	float NdotH = dot(N,H);
	vec4 specular = pow(max(0.0,NdotH),gl_FrontMaterial.shininess);
	if(NdotL <=0)//条件によってはspecular無し
	{
		specular = 0;
	}
	specular = specular* gl_LightSource[0].specular * gl_FrontMaterial.specular;

	gl_FragColor = ambient + diffuse + specular;
}

サンプルコード

目次

― その他 ―

Wiki内検索

計測中...(07.10.8〜)

Save The World






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


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

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