OpenGL Superbibleのサンプルコードです。
JXS / GLSL
[html]
<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>
[/html]
Vertex Shaderの方でカメラからの距離を算出しておいて、Fragment Shadreで色を計算する時にFogの方程式を使ってFog量を決めています。