Just My Life & My Work

[GLSL] Multi-Texture

GLSL多貼圖。

vertex shader的程式碼:

varying vec3 lightDir,normal;

void main()
{
	normal = normalize(gl_NormalMatrix * gl_Normal);
	lightDir = normalize(vec3(gl_LightSource[0].position));

	gl_TexCoord[0] = gl_MultiTexCoord0;
	gl_Position = ftransform();
}

fragment shader的程式碼:

uniform sampler2D tex,l3d;

void main()
{
	vec3 ct,cf,c;
	vec4 texel;
	float intensity,at,af,a;

	intensity = max(dot(lightDir,normalize(normal)),0.0);

	cf = intensity * gl_FrontMaterial.diffuse.rgb +
					 gl_FrontMaterial.ambient.rgb;
	af = gl_FrontMaterial.diffuse.a;

	texel = texture2D(tex,gl_TexCoord[0].st);

	ct = texel.rgb;
	at = texel.a;

	c = cf * ct;
	a = af * at;

	float coef = smoothstep(1.0,0.2,intensity);
	c += coef *  vec3(texture2D(l3d,gl_TexCoord[0].st));

	gl_FragColor = vec4(c, a);
}

執行結果:

Multi-Texture

此程式多加了一個貼圖,上頭有L3D三個字元,正對光源會消失,背對光源會顯現,由smoothstep函式來控制。

float smoothstep (float edge0, float edge1, float x)
Returns 0.0 if x <= edge0 and 1.0 if x >= edge1 and performs smooth Hermite interpolation between 0.0 and 1.0 when edge0 < x < edge1. Results are undefined if edge0 >= edge1.

將L3D換成我的大頭照。

把crate換成我的大頭照。

參考:Tutorials » GLSL 1.2 Tutorial » Multi-Texture

隨意留個言吧:)~

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料

標籤雲