Atmospheric Scattering with SkyDome, shader implementation

Started by
8 comments, last by jimzer 7 years, 11 months ago

Hi,

I'm trying to implement an atmospheric scattering in openGL. I'm using this "paper" as tutorial:
http://developer.amd.com/wordpress/media/2012/10/GDC_02_HoffmanPreetham.pdf

However I have some difficulties to understand certain points and to figure out some constants.

Basically I've to implement these formulas:
[attachment=31800:Screenshot from 2016-05-08 13-41-18.png]

Firstly i don't know if s is the distance from eye to the dome or the distance from eye to the light source (here sun) position.
Same for the angle theta I can't figure out if it's the angle from ground to sun or to the dome position the eye is looking at.

Secondly in this slide:
[attachment=31801:Screenshot from 2016-05-08 13-46-07.png]

It tells me the blue color of the sky will appears. I know it's cause of rayleigh scattering but there is something i can't understand. All the calculation in the formulas above give me a scalar: so how a white light of the sun wich is basically a vec3(1,1,1), will become blue when I multiply it by scalars, it will only get in gray scale because I will have for result for example vec3(0.8,0.8,0.8). I mean , if some different sky color appears, I must multiply the sun light with a vec3 to change the RGB value differently.

Advertisement

The ?R parameter is an RGB vector.

In my code, it's {0.0000055, 0.000013, 0.0000224}

Thank you :D

Could you give me some other of your parameter, because i have trouble to find it on web. I mean all I get isn't as an RGB vector.

If you could give me your Esun and Bm parameter ?

A person called M?rti?š Up?tis made a Preetham implementation in Blender Game Engine. I could try to find the file. However, he found out that using Hosek-Wilkie is way better idea. Currently he's been working on the Hosek-Wilkie shader and has had some great progress.

Could you give me some other of your parameter, because i have trouble to find it on web. I mean all I get isn't as an RGB vector.

If you could give me your Esun and Bm parameter ?

My sky is based off this article, which has all the numbers in it's accompanying source code: http://www.scratchapixel.com/old/lessons/3d-advanced-lessons/simulating-the-colors-of-the-sky/atmospheric-scattering

?M is 0.000021

Esun seems arbitrary; they use 20 in this article. I guess you can search for "irradiance of sun on earth" if you're using real units in your renderer.

Thank you a lot :)
I think it will really help me ;)

Hi, I encountered some difficulties to implement my shader.

Here is the code for the sky shader:


#version 330

in vec3 vpoint;
in vec2 vtexcoord;

out vec2 uv;

out vec3 atmos;

uniform mat4 M;
uniform mat4 V;
uniform mat4 P;

mat4 MVP = P*V*M;


//uniform vec3 lpos;
vec3 lpos = vec3(100,0,0);
uniform vec3 cpos;


vec3 br = vec3(5.5e-6, 13.0e-6, 22.4e-6);
vec3 bm = vec3(21e-6);




float g = -0.75f;

vec3 Esun = vec3(2000,2000,2000);



vec3 Br(float theta){
    return 3/(16*3.14) * br * (1+cos(theta)*cos(theta));
}

vec3 Bm(float theta){
    return 1/(4*3.14) * bm * ((1 - g)*(1 - g))/(pow(1+g*g-2*g*cos(theta),3/2));
}

vec3 atmospheric(float theta, float s){
    return (Br(theta)*Bm(theta))/(br+bm) * Esun * (1- exp( -(br+bm)*s ));
}

void main() {

    gl_Position = MVP * vec4(vpoint, 1.0);
    uv = vtexcoord;

    vec3 domePos = vec3(M*vec4(vpoint,1.0));

    vec3 ldir = lpos - domePos;

    float s = length(domePos-cpos);
    float theta = acos(dot(normalize(ldir-domePos),normalize(domePos-cpos)*vec3(1,1,0)));

    atmos = atmospheric(theta,s)*1000000*5;
}

I don't get what I'm expected, here is what I get:

http://imgur.com/q6uEzE6

I only have the blue, and no redish sunset, yet the sun is low and according to the different tutorials I have seen, i should see some redish color appear when the sun goes low.

Maybe you've got too high exprossure or something like that? I'm not sure about it.

First things first, try adding a tonemapping operator at the end of your shader.
e.g. reinhard:
atmos = pow( clamp(atmos / (atmos+1.0),0.0,1.0), vec3(1.0/2.2) );
or logarithmic:
atmos = pow( clamp(smoothstep(0.0, 12.0, log2(1.0+atmos)),0.0,1.0), vec3(1.0/2.2) );

Thank you for your help.

For the exposure the problem is that is I reduce the exposure, the scene get dark quite quickly.

I implemented the tone mapping you gave me, it gives a much homogeneous scene :) I didn't know this technic.

http://imgur.com/8TTtvGx

However I can't find why I don't get the effect of the scattering. Maybe the mie scattering isn't good, because rayleigh seems "working" since the blue color is present.

This topic is closed to new replies.

Advertisement