[B3D]Athmosphäreneffekt

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

Foppele

Betreff: [B3D]Athmosphäreneffekt

BeitragSa, Nov 24, 2007 14:54
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSa, Nov 24, 2007 20:15
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSa, Nov 24, 2007 21:38
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragFr, Nov 30, 2007 19:05
Antworten mit Zitat
Benutzer-Profile anzeigen
sieht schick aus,doch ich finde den atmosphäreneffekt etwas zu stark. gibt es eine möglichkeit den dlauen bereich zu redutzieren?

Foppele

BeitragSo, Dez 02, 2007 1:00
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Dez 02, 2007 20:16
Antworten mit Zitat
Benutzer-Profile anzeigen
*rumspiel*
so hab mal was zusamengebaut:
http://img231.imageshack.us/im...odeve2.jpg
ich finde die sache ist echt brauchbar! tolles ergebniss!

Foppele

BeitragMo, Dez 03, 2007 11:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Hmm,
ich seh gar keinen Effekt, hast du vielleicht das falsche Bild verlinkt?
 

Code der Verwirrung

BeitragMo, Dez 03, 2007 14:17
Antworten mit Zitat
Benutzer-Profile anzeigen
wie kein effekt... Shocked also ich sehe da einen effekt (guck dir doch den hellen rand des planeten an)
zugegeben:ich wollte den effekt nicht so stark haben.
 

Mr Hopp

BeitragMo, Dez 03, 2007 14:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich kann beim besten Willen auch keinen Effekt erkennen Confused
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.

Xeres

Moderator

BeitragMo, Dez 03, 2007 15:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Hübscher Planetenschatten, Code der Verwirrung, sieht so real aus, das man den Effekt übersehen kann Wink
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
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Foppele

BeitragMo, Dez 03, 2007 15:25
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Wink
 

Code der Verwirrung

BeitragMo, Dez 03, 2007 16:00
Antworten mit Zitat
Benutzer-Profile anzeigen
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

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group