Warsztat - Programowanie gier

Wrzesień 03, 2010, 04:11:20 *
Witamy, Gość. Zaloguj się, lub zarejestruj proszę.

Zaloguj się podając nazwę użytkownika, hasło i długość sesji
Aktualności: Warsztat, Regulamin forum, #warsztat, Wiki, FAQ, NoPaste, Mapa
 
   Strona główna   Pomoc Szukaj Zaloguj się Rejestracja  
Strony: [1]
  Drukuj  
Autor Wątek: Opengl - GLSL - Atmospheric Scattering  (Przeczytany 786 razy)
stalker
Newbie
*

wiadomości: 20


Zobacz profil
« : Luty 04, 2010, 18:08:29 »

Bardzo bym prosił o wskazówki i wyjaśnienie jak ten wzór (http://en.wikipedia.org/wiki/Rayleigh_scattering) który wyliczy intensywność światła docierającego do obserwatora zastosować aby osiągnąć atmospheric scattering.
« Ostatnia zmiana: Luty 04, 2010, 18:37:16 wysłane przez stalker » Zapisane
WielkiPan
Full Member
***

wiadomości: 139


Life is brutal.


Zobacz profil WWW
« Odpowiedz #1 : Luty 04, 2010, 18:17:34 »

Cytuj
Kod Fragmęt shadera
Punkt 7 regulaminu
Punkt 2 "Jak nie lamić?"
Zapisane

Stopień głupoty Twojego postępowania jest wprost proporcjonalny do liczby przyglądających Ci się osób.
Moje portfolio: http://listwon.carbonmade.com/
yarpen
SuperHero Member
******

wiadomości: 1445


Zobacz profil WWW
« Odpowiedz #2 : Luty 04, 2010, 18:48:54 »

1. Bierzesz papiery Hoffmana i Preethama (Google),
2. Przepisujesz wzorki i stale
3. Profit
Zapisane
Krzysiek K.
Member2000
*******

wiadomości: 9879



Zobacz profil
« Odpowiedz #3 : Luty 04, 2010, 20:18:46 »

Bierzesz kilka kolorów, które wyglądają jak niebo, interpolujesz na podstawie wartości wziętych z czapki i iloczynów skalarnych różnych wartości i kłopot z głowy. Wink
Zapisane

Aktualne zajęcie: Szkoła DJKurs DJ
stalker
Newbie
*

wiadomości: 20


Zobacz profil
« Odpowiedz #4 : Luty 09, 2010, 13:56:42 »

Hymm, poczytałem sprawdziłem praktycznie wszystko co na googlach udało mi się znaleźć - najbardziej zaciekawiły mnie te dwa artykuły:

-http://docs.google.com/viewer?a=v&q=cache:Ixh0067gSOAJ:developer.amd.com/media/gpu_assets/ATI-LightScattering.pdf+Preetham+scattering&hl=pl&gl=pl&sig=AHIEtbRp536BUYqouHEK9QmYQlwZXXvjcg

-http://developer.amd.com/media/gpu_assets/PreethamSig2003CourseNotes.pdf

Choć ciągle nie bardzo kumam jak to działa. Wydaje mi się że wzór na to kolorowanie powinien liczyć długość fali świetlnej w danym miejscu( dla danej cząsteczki) następnie konwertować wynik na rgb i kolorować. Tymczasem widzę tu jakieś kosmosy całki i tym podobne. Jeśli ktoś mógłby mi pomóc rozszyfrować te wzory to bardzo bym prosił.
Zapisane
_OskaR
Hero Member
*****

wiadomości: 755



Zobacz profil
« Odpowiedz #5 : Luty 09, 2010, 14:05:54 »

Hymm, poczytałem sprawdziłem praktycznie wszystko co na googlach udało mi się znaleźć - najbardziej zaciekawiły mnie te dwa artykuły:

-http://docs.google.com/viewer?a=v&q=cache:Ixh0067gSOAJ:developer.amd.com/media/gpu_assets/ATI-LightScattering.pdf+Preetham+scattering&hl=pl&gl=pl&sig=AHIEtbRp536BUYqouHEK9QmYQlwZXXvjcg

-http://developer.amd.com/media/gpu_assets/PreethamSig2003CourseNotes.pdf

Choć ciągle nie bardzo kumam jak to działa. Wydaje mi się że wzór na to kolorowanie powinien liczyć długość fali świetlnej w danym miejscu( dla danej cząsteczki) następnie konwertować wynik na rgb i kolorować. Tymczasem widzę tu jakieś kosmosy całki i tym podobne. Jeśli ktoś mógłby mi pomóc rozszyfrować te wzory to bardzo bym prosił.
- http://docs.google.com/viewer?a=v&q=cache:Ixh0067gSOAJ:developer.amd.com/media/gpu_assets/ATI-LightScattering.pdf+Preetham+scattering&hl=pl&gl=pl&sig=AHIEtbRp536BUYqouHEK9QmYQlwZXXvjcg

- http://developer.amd.com/media/gpu_assets/PreethamSig2003CourseNotes.pdf  Tongue
Zapisane

Prawdziwy programista wiesza się razem ze swoim programem.
stalker
Newbie
*

wiadomości: 20


Zobacz profil
« Odpowiedz #6 : Luty 09, 2010, 23:53:03 »

Koledzy, ponawiam prośbę i grzecznie proszę pomóżcie bo utknąłem w miejscu.
Zapisane
stalker
Newbie
*

wiadomości: 20


Zobacz profil
« Odpowiedz #7 : Luty 14, 2010, 14:49:15 »

uff prawie mi się udało mam tylko mały problem może wiecie o co chodzi. Otuż niebo koloruje mi się tylko z zewnątrz w środku jest całe czarne.

Kod:

void main(void)
{
// Get the ray from the camera to the vertex and its length (which is the far point of the ray passing through the atmosphere)
vec3 v3Pos = gl_Vertex.xyz;
vec3 v3Ray = v3Pos - v3CameraPos;
float fFar = length(v3Ray);
v3Ray /= fFar;

// Calculate the closest intersection of the ray with the outer atmosphere (which is the near point of the ray passing through the atmosphere)
float B = 2.0 * dot(v3CameraPos, v3Ray);
float C =  fCameraHeight2 - fOuterRadius2;
float fDet = max(0.0, B*B - 4.0 * C);
float fNear = 0.5 * (-B - sqrt(fDet));

// Calculate the ray's starting position, then calculate its scattering offset
vec3 v3Start = v3CameraPos + v3Ray * fNear;
fFar -= fNear;
float fDepth = exp((fInnerRadius - fOuterRadius) / fScaleDepth);
float fCameraAngle = dot(-v3Ray, v3Pos) / length(v3Pos);
float fLightAngle = dot(v3LightPos, v3Pos) / length(v3Pos);
float fCameraScale = scale(fCameraAngle);
float fLightScale = scale(fLightAngle);
float fCameraOffset = fDepth*fCameraScale;
float fTemp = (fLightScale + fCameraScale);

// Initialize the scattering loop variables
float fSampleLength = fFar / fSamples;
float fScaledLength = fSampleLength * fScale;
vec3 v3SampleRay = v3Ray * fSampleLength;
vec3 v3SamplePoint = v3Start + v3SampleRay * 0.5;

// Now loop through the sample rays
vec3 v3FrontColor = vec3(0.0, 0.0, 0.0);
vec3 v3Attenuate;
for(int i=0; i<nSamples; i++)
{
float fHeight = length(v3SamplePoint);
float fDepth = exp(fScaleOverScaleDepth * (fInnerRadius - fHeight));
float fScatter = fDepth*fTemp - fCameraOffset;
v3Attenuate = exp(-fScatter * (v3InvWavelength * fKr4PI + fKm4PI));
v3FrontColor += v3Attenuate * (fDepth * fScaledLength);
v3SamplePoint += v3SampleRay;
}

gl_FrontColor.rgb = v3FrontColor * (v3InvWavelength * fKrESun + fKmESun);

// Calculate the attenuation factor for the ground
gl_FrontSecondaryColor.rgb = -v3Attenuate;

gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;

}

Zapisane
Kuba D.
Hero Member
*****

wiadomości: 993


Zobacz profil
« Odpowiedz #8 : Luty 14, 2010, 15:14:24 »

Zamiast kombinować z gl_FrontColor i gl_FrontSecondaryColor; prześlij to do fragment shadera jako zwyczajne varying vec3 color0, color1; i we fs wylicz końcowy kolor. Bo pewnie masz wierzchołki w odwrotnej kolejności i u Ciebie front jest tam gdzie jest back Wink Albo zmień na ccw/cw albo zrób tak jak napisałem wcześniej.

EDIT: Jest jeszcze opcja, że normalne są odwrócone.
« Ostatnia zmiana: Luty 14, 2010, 15:18:58 wysłane przez Kuba D. » Zapisane
stalker
Newbie
*

wiadomości: 20


Zobacz profil
« Odpowiedz #9 : Luty 14, 2010, 17:21:43 »

No i jak tak zrobiłem to otrzymałem bardzo dziwny wynik. Pokażę screeny to jest dla ccw:
http://www.fotosik.pl/pokaz_obrazek/ff878ca2fbafaa8d.html
 a to dla cw:
http://www.fotosik.pl/pokaz_obrazek/9c81aa4f59844825.html
 oczywiście po zmienionym shaderze. (te same ujęcie) w środku dalej czarno.
Zapisane
Kuba D.
Hero Member
*****

wiadomości: 993


Zobacz profil
« Odpowiedz #10 : Luty 14, 2010, 17:46:34 »

To dwa screeny to jest to samo ujęcie ?

Zresztą jeśli nie patrzyłeś jeszcze w gpu gems to masz tam wiele wyjaśnione + kod shaderów.
http://http.developer.nvidia.com/GPUGems2/gpugems2_chapter16.html
Zapisane
Strony: [1]
  Drukuj  
 
Skocz do:  

Hosting: Polska Strefa - Ogłoszenia
Powered by SMF 1.1.7 | SMF © 2006, Simple Machines LLC