My Account


RSS
oZone3D.Net RSS Feeds»RSS 2.0 Feeds

Blogs
»Demoniak3D Blog
»JeGX's Infamous Lab

Sponsors

Modul8: real time video mixing and compositing


Link to Us

oZone3D.Net 100% Realtime 3D

»All Links

Web Partners

www.geeks3d.com
www.benchmarkhq.ru
www.tdt3d.com
www.steph3d.net
www.g-truc.net
www.worldpcspecs.com


Banners Exchange

www.jmax-hardware.com
cgindia.blogspot.com
grapejuice.c.la
www.game-lab.com


Links Exchange

»CYGAD's 3DXtra

Search
Google
Web
oZone3D.Net
 
Fog in GLSL

By Jerome 'JeGX' Guinot - jegx_AT_ozone3d(dot)net

Initial draft: December 21, 2007


[ Index ]

Page 1 | Page 2 | Page 3 | Page 4 | Page 5

»Next Page





4 - Per-Pixel Fog Computation

We shall see here how to compute the fog at each pixel level . The principle is exactly the same as by vertex. The only difference resides in the determination of the distance between the camera and the currently processed pixel . In the per-pixel fog computation, the vertex shader is inactive, because the calculus is made in the pixel shader .

In GLSL there exists a gl_FragCoord variable. This one is an input variable of the pixel shader. gl_FragCoord contains the screen coordinates of the current pixel. For example, if the demo's window has a width of 1280 pixels, the following code :

if(gl_FragCoord.x < 700.0)
{
	gl_FragColor = vec4(0.0, 0.5, 0.0, 1.0);
}
else
{
	gl_FragColor = mix(gl_Fog.color, finalColor, fogFactor );
}

should give the following image :

Fog Factor - GL_LINEAR - GL_EXP - GL_EXP2
DEMO_GLSL_Fog_FragCoord.xml

The distance between the camera and the current pixel (the z axis value) is obtained by the following relation :

float z = gl_FragCoord.z / gl_FragCoord.w;

It is quite easy, thanks to this relation, to show a z-buffer view from the camera's point of view:

float z = 1.0 - (gl_FragCoord.z / gl_FragCoord.w) / 4000.0;
gl_FragColor = vec4(z, z, z, 1.0);

Fog Factor - GL_LINEAR - GL_EXP - GL_EXP2
DEMO_GLSL_Fog_DepthBuffer_Visualization.xml

The 4000.0 corresponds to the far clipping plane (zfar), initialized in the Demoniak3D demo.

That said, let's come back to the fog computation. The following code show how to implement the fog calculus per-pixel:

const float LOG2 = 1.442695;
float z = gl_FragCoord.z / gl_FragCoord.w;
float fogFactor = exp2( -gl_Fog.density * 
				   gl_Fog.density * 
				   z * 
				   z * 
				   LOG2 );
fogFactor = clamp(fogFactor, 0.0, 1.0);

gl_FragColor = mix(gl_Fog.color, finalColor, fogFactor );




[ Index ]

Page 1 | Page 2 | Page 3 | Page 4 | Page 5

»Next Page







Language:


Demoniak3D
Current Version: 1.23.0
»Demoniak3D
»Download
»Libraries and Plugins
»Demos
»Online Help - Reference Guide
»Codes Samples


GPU Caps Viewer
Current Version: 1.4.2
»GPU Caps Viewer
»GPU DB Submissions


FurMark
Current Version: 1.4.0
»FurMark
»Benchmark Submissions


Geeks3D News
Page generated in 0.07226300239563 seconds.