[B3D]Athmosphäreneffekt
Übersicht

![]() |
FoppeleBetreff: [B3D]Athmosphäreneffekt |
![]() Antworten mit Zitat ![]() |
---|---|---|
Eine Art Incidence-Shader für Planetenatmosphären oder auch alles mögliche andere - beeinflusst Vertexalpha relativ zur Kamera.
Basiert auf dem Dot3 Tutorial von Vertex: Code: [AUSKLAPPEN] Graphics3D 640,480,32,2 SetBuffer BackBuffer() frametimer= CreateTimer(30) light=CreateLight(2) LightColor light,100,100,200 PositionEntity light,100,100,-100 AmbientLight 0,0,0 sphere=CreateSphere(48); Atmosphere EntityColor sphere,127,127,127 EntityFX sphere,34 EntityOrder sphere,0 RotateMesh sphere,90,0,0 sphere2=CreateSphere(48) ; Corona, Background ScaleEntity sphere2,1,1,1 EntityColor sphere2,127,127,127 EntityFX sphere2,3 EntityOrder sphere2,1 RotateMesh sphere2,90,0,0 planet=CreateSphere(48) ScaleEntity planet,0.9,0.9,0.9 EntityColor planet,100,70,20 cam=CreateCamera() EntityParent cam,planet PositionEntity cam,0,0,-2 CameraZoom cam,1 CameraRange cam,0.1,1000 Incidence(sphere,cam,1.3); Atmosphere Mesh, Camera, Falloff Factor (Values from 1.0 to 2.0) Incidence2(sphere2,cam,1.2); Corona Mesh, Camera, Falloff Factor (Values from 1.0 to 2.0) ;--------------------------------------------------------------------------------------------------------------------------------- While Not KeyHit(1) PointEntity sphere,cam TurnEntity sphere,0,180,0 PointEntity sphere2,cam TurnEntity sphere2,0,180,0 TurnEntity planet,0.5,0,0 Size#=coronaSize#(cam,planet,light,1.1) ; Calculates Corona Size by Angle Camera-Planet-Lightsource, Factor (Values from 0.5 to 1.5) ScaleEntity sphere2,Size#,Size#,Size# UpdateWorld RenderWorld WaitTimer frametimer Flip 0 Wend ;-------------------------------------------------------------------------------------------------------------------------------- Function Incidence(Mesh, Camera,Factor#) Local LX#, LY#, LZ#, LNX#, LNY#, LNZ# Local S, Surface, V, VX#, VY#, VZ#, VNX#, VNY#, VNZ# Local Length#, DotProduct# ; get the cameracoords LX# = EntityX#(Camera, 1) LY# = EntityY#(Camera, 1) LZ# = EntityZ#(Camera, 1) For S = 1 To CountSurfaces(Mesh) Surface = GetSurface(Mesh, S) For V = 0 To CountVertices(Surface)-1 ; get vertexcoords VX# = VertexX#(Surface, V) VY# = VertexY#(Surface, V) VZ# = VertexZ#(Surface, V) ; get vertexnormalcoords VNX# = VertexNX#(Surface, V) VNY# = VertexNY#(Surface, V) VNZ# = VertexNZ#(Surface, V) ; transform vertexcoords into worldcoords TFormPoint VX#, VY#, VZ#, Mesh, 0 VX# = TFormedX#() VY# = TFormedY#() VZ# = TFormedZ#() ; transform vertexnormalcoords into worldnormalcoords TFormNormal VNX#, VNY#, VNZ#, Mesh, 0 VNX# = TFormedX#() VNY# = TFormedY#() VNZ# = TFormedZ#() ; calculate a vector between vertex and camera LNX# = LX#-VX# LNY# = LY#-VY# LNZ# = LZ#-VZ# ; normalize this vector Length# = Sqr#(LNX#^2.0+LNY#^2.0+LNZ#^2.0) LNX# = LNX#/Length# LNY# = LNY#/Length# LNZ# = LNZ#/Length# ; calculate the dotproduct between vertexnormal and the vector between camera and vertex DotProduct# = VNX#*LNX#+VNY#*LNY#+VNZ#*LNZ# ;additional calculations If DotProduct# < 0.0 Then DotProduct# = 0.0 DotCopy#=1.0-DotProduct# Ergebnis#=min#(DotProduct#^Factor#,DotCopy#^Factor#) ;set vertexcolors and alpha VertexColor Surface, V, 70, 70, 255, Ergebnis# Next Next End Function ;---------------------------------------------------------------------------------------------------------------------------------- Function Incidence2(Mesh, Camera,Factor#) Local LX#, LY#, LZ#, LNX#, LNY#, LNZ# Local S, Surface, V, VX#, VY#, VZ#, VNX#, VNY#, VNZ# Local Length#, DotProduct# ; get the cameracoords LX# = EntityX#(Camera, 1) LY# = EntityY#(Camera, 1) LZ# = EntityZ#(Camera, 1) For S = 1 To CountSurfaces(Mesh) Surface = GetSurface(Mesh, S) For V = 0 To CountVertices(Surface)-1 ; get vertexcoords VX# = VertexX#(Surface, V) VY# = VertexY#(Surface, V) VZ# = VertexZ#(Surface, V) ; get vertexnormalcoords VNX# = VertexNX#(Surface, V) VNY# = VertexNY#(Surface, V) VNZ# = VertexNZ#(Surface, V) ; transform vertexcoords into worldcoords TFormPoint VX#, VY#, VZ#, Mesh, 0 VX# = TFormedX#() VY# = TFormedY#() VZ# = TFormedZ#() ; transform vertexnormalcoords into worldnormalcoords TFormNormal VNX#, VNY#, VNZ#, Mesh, 0 VNX# = TFormedX#() VNY# = TFormedY#() VNZ# = TFormedZ#() ; calculate a vector between vertex and camera LNX# = LX#-VX# LNY# = LY#-VY# LNZ# = LZ#-VZ# ; normalize this vector Length# = Sqr#(LNX#^2.0+LNY#^2.0+LNZ#^2.0) LNX# = LNX#/Length# LNY# = LNY#/Length# LNZ# = LNZ#/Length# ; calculate the dotproduct between vertexnormal and the vector between camera and vertex DotProduct# = VNX#*LNX#+VNY#*LNY#+VNZ#*LNZ# ;additional calculations If DotProduct# < 0.0 Then DotProduct# = 0.0 DotCopy#=1.0-DotProduct# ;set vertexcolors and alpha VertexColor Surface, V, 100*DotProduct#^1.5,100*DotProduct#^1.5,255*DotProduct#^1.5 Next Next End Function ;----------------------------------------------------------------------------------------------------------------------------------- Function min#(A#,B#) If A#<B# Then Return A# If B#<A# Then Return B# End Function ;----------------------------------------------------------------------------------------------------------------------------------- Function coronaSize#(Camera,Planet,Light,Factor#) ;get coordinates TFormPoint EntityX#(Camera),EntityY#(Camera),EntityZ#(Camera),Planet,0 CameraX#= TFormedX#() CameraY#= TFormedY#() CameraZ#= TFormedZ#() PlanetX#= EntityX#(Planet) PlanetY#= EntityY#(Planet) PlanetZ#= EntityZ#(Planet) LightX#= EntityX#(Light) LightY#= EntityY#(Light) LightZ#= EntityZ#(Light) ;calculate vector planet-camera VPCX# = CameraX# - PlanetX# VPCY# = CameraY# - PlanetY# VPCZ# = CameraZ# - PlanetZ# ;calculate vector planet-light VPLX# = LightX# - PlanetX# VPLY# = LightY# - PlanetY# VPLZ# = LightZ# - PlanetZ# ;calculate angle + result Skal#= Sqr#(VPCX#^2.0+VPCY#^2.0+VPCZ#^2.0)*Sqr#(VPLX#^2.0+VPLY#^2.0+VPLZ#^2.0) Cosinus# = (VPCX#*VPLX# + VPCY#*VPLY# + VPCZ#*VPLZ#)/Skal# Angle#=ACos#(Cosinus#) Result#= 0.8+Angle#/700*Factor# Return Result# End Function [EDIT] Überarbeitet: Incidence wird nicht mehr für jeden Frame berechnet, zusätzlicher Corona effekt[/code] |
||
- Zuletzt bearbeitet von Foppele am Sa, Dez 08, 2007 10:43, insgesamt 4-mal bearbeitet
![]() |
mabox |
![]() Antworten mit Zitat ![]() |
---|---|---|
Sieht sehr gut aus!
wirklich interressant. |
||
Fujitsu-Siemens Laptop, 2Ghz Intel Core2Duo Prozessor, 2GB Ram, 120GB Festplatte, ATI Mobility Radeon X1400, Windows Vista Ultimate
www.mausoft.de.tl Dönerfresser Homepage |
![]() |
Foppele |
![]() Antworten mit Zitat ![]() |
---|---|---|
Mir fällt grad noch ein, wenn man es auf ne Kugel anwendet kann man die auch auf die Kamera pointen und muss nicht für jeden Frame alles neu berechnen! | ||
Code der Verwirrung |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
sieht schick aus,doch ich finde den atmosphäreneffekt etwas zu stark. gibt es eine möglichkeit den dlauen bereich zu redutzieren? | ||
![]() |
Foppele |
![]() Antworten mit Zitat ![]() |
---|---|---|
Spiel mit den Falloff Factor Werten rum, und wenn du in die Funktionen guckst findest du auch eine Zeile wo du die Farbe änderst. | ||
Code der Verwirrung |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
*rumspiel*
so hab mal was zusamengebaut: http://img231.imageshack.us/im...odeve2.jpg ich finde die sache ist echt brauchbar! tolles ergebniss! |
||
![]() |
Foppele |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hmm,
ich seh gar keinen Effekt, hast du vielleicht das falsche Bild verlinkt? |
||
Code der Verwirrung |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
wie kein effekt... ![]() zugegeben:ich wollte den effekt nicht so stark haben. |
||
Mr Hopp |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ich kann beim besten Willen auch keinen Effekt erkennen ![]() |
||
Zitat:
Wie poste ich falsch? Nachdem ich Google, die FAQ's und die Boardsuche erfolgreich ignoriert habe, erstelle ich zwei bis fünf neue Themen, in den falschen Unterforen, mit kreativen Titeln und undeutlichem Text, unter dem sich jeder etwas anderes vorstellen kann. |
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hübscher Planetenschatten, Code der Verwirrung, sieht so real aus, das man den Effekt übersehen kann ![]() Und auch Foppele, interessanter Code, nur recht wenig kommentiert. Natürlich muss da etwas Vorstellung von Vektoren vorhanden sein, aber etwas ausführlicher wäre schön... |
||
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
Foppele |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hi,
also die Berechnung des Dot Products hat ja Vertex in seinem Tutorial schon erklärt, das spare ich mir mal. Ist vielleicht auch sowas wie Grundwissen für Shader und Vertexshader. Der Rest ist zugegebenermassen dürftig kommentiert, wenn jemand das haben will mach ich das gerne noch. Ich wollte halt keinen Roman schreiben bevor ich weiss ob's überhaupt jemanden interessiert ![]() |
||
Code der Verwirrung |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
naja gut vlt. ist der effekt etwas zu schwach gewesen. ich habe es geändert und hoffe dass es euch jetzt beser gefällt:
http://img102.imageshack.us/im...odegn4.jpg |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group