jit.gl.shader / GLSL でフォグ #maxmsp #jitter #glsl

スクリーンショット 2014-08-05 03.50.41

OpenGL Superbibleのサンプルコードです。

JXS / GLSL

<jittershader name="mrr-3colored-lights">
	<description>
	</description>

	<language name="glsl" version="1.2">
		<program name="vp" type="vertex">
<![CDATA[

#version 120 

void main(void)
{
	gl_Position = gl_ModelViewProjectionMatrix *gl_Vertex;
	
	vec3 lightPos = gl_LightSource[0].position.xyz;
	
	vec3 N = normalize(gl_NormalMatrix * gl_Normal);
	vec4 V = gl_ModelViewMatrix *gl_Vertex;
	vec3 L = normalize(lightPos - V.xyz);
	vec3 H = normalize(L + vec3(0,0,1));
	
	const float specularExp = 128.0;
	
	
	float NdotL =max(0,dot(N,L));
	vec4 diffuse = gl_Color * vec4(NdotL);
	
	float NdotH = max(0,dot(N,H));
	vec4 specular = vec4(0);
	
	if(NdotL >0){
		specular = vec4(pow ( NdotH,specularExp));
	}
	
	gl_FogFragCoord =length(V);
	gl_FrontColor = (diffuse + specular);
}
]]>
		</program>
		<program name="fp" type="fragment">
<![CDATA[

#version 120

void main()
{
	 const float e = 2.71828;
	 float fogFactor = pow(0.5 *gl_FogFragCoord,2);
	 fogFactor = clamp(pow(e,-fogFactor),0,1);
	 
	 const vec4 fogColor =vec4(0.5,0.5,0.5,0.4);
	 gl_FragColor = mix(fogColor,gl_Color,fogFactor);
}
]]>
		</program>
	</language>
</jittershader>

Vertex Shaderの方でカメラからの距離を算出しておいて、Fragment Shadreで色を計算する時にFogの方程式を使ってFog量を決めています。

Leave a Comment