Function der Beleuchtung in Blitz3D

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

Fuchsi

Betreff: Function der Beleuchtung in Blitz3D

BeitragMo, Feb 06, 2006 19:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Weiß jmand von euch welche Berechnungen hinter dem Beleuchtungssystem von Blitz3D steckt ?

Ich hatten nähmlich die Idee ein Licht zu Programmieren das wirklich nur die vom Licht sichtbaren Dinge beleuchtet.
Ne schwierige Frage aber vielleicht weiß es jemand.

Gruß Fuchsi !

skey-z

BeitragMo, Feb 06, 2006 19:41
Antworten mit Zitat
Benutzer-Profile anzeigen
1. falsches Forum

2. verwende vor dem setzen des lichts "ambientlight 0, 0, 0", so sind die nicht beleuchteten Polygone schwarz

3. Schatten musst du dir jedoch selber erstellen, sonst werden auch verdeckte objekte beleuchtet
Awards:
Coffee's Monatswettbewerb Feb. 08: 1. Platz
BAC#57: 2. Platz
Twitter
  • Zuletzt bearbeitet von skey-z am Mo, Feb 06, 2006 19:42, insgesamt einmal bearbeitet

YellowRider

Ehemaliger Admin

BeitragMo, Feb 06, 2006 19:42
Antworten mit Zitat
Benutzer-Profile anzeigen
~VERSCHOBEN~
Dieser Thread passte nicht in das Forum, in dem er ursprünglich gepostet wurde.


YellowRider

Fuchsi

BeitragMo, Feb 06, 2006 19:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich hab extra nachgedacht in welches Forum aber da steht ja: Häufig gestellte Fragen und Tutorials zu Blitzbasic".
Wenn ich trotzdem falsch liege dann: Embarassed

Vielleicht hab ich mich aber nich klar ausgedrückt.
Ich meine dass das Licht von Blitz3D ja praktisch durch die Objekte durchgeht. Nun versucht ich aber das das Licht eben nicht durch Objekte durchscheien kann.

Trotzdem Danke
Fuchsi.

skey-z

BeitragMo, Feb 06, 2006 19:48
Antworten mit Zitat
Benutzer-Profile anzeigen
wie schon gesagt, entweder eigene Schattenengine schreiben, oder eine (kostenlose) ausm Netz benutzen.
Awards:
Coffee's Monatswettbewerb Feb. 08: 1. Platz
BAC#57: 2. Platz
Twitter

Fuchsi

BeitragMo, Feb 06, 2006 19:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Hab ich a grad kostenlos gehöhrt ? Confused
In allen Threads die ich geslsen habe hat man mir gesagt , dass es keine kostenlose gibt.

Kannste vielleicht nen Link posten ?
Fuchsi !
 

Ava

Gast

BeitragDi, Feb 07, 2006 9:55
Antworten mit Zitat
Huhu,

um mal direkt auf Deine eigentliche Frage zu antworten, ohne irgendwas von wegen "Schattenengine" mit einzuwerfen. Rolling Eyes Du kannst Dir eine eigene Lichtquelle recht einfach selber schreiben. Am besten legt man sich dafür einen Type an, um die Licht-Eigenschaften darin zu speichern, und für die eigentliche Quelle ist es sehr hilfreich, einen Pivot zu verwenden, da man dann auch weiterhin direkt mit den Standardbefehlen arbeiten kann, um diese zu Positionieren ect. Als nächstes muss dann jedes Mesh in der Szene auf EntityFX 2 (VertexColor) eingestellt werden und anschliessend wird in der Hauptschleife in jedem Loop die Beleuchtung durch Deine Lichter berechnet. Dazu musst Du in jedem Mesh alle Vertices jeder Surface durchgehen, die Entfernung zur Lichtquelle (oder den Lichtquellen, wenn mehrere) bestimmen und dann entsprechend der Entfernung und den Licht-Eigenschaften die Vertex-RGB-Werte setzen. Einfache Szenen lassen sich damit sehr flott ausleuchten. Wenn Du nun möchtest, dass sich die Objekte gegenseitig verdecken und damit quasi Schatten werfen, dann müsstest Du vor der Bestimmung der Entfernung von Pivot zu Lichtquelle noch einen LinePick werfen. Wenn Du für alle Objekte den Pickmode setzt, sollte das funktionieren. Der Geschwindigkeitsverlust wird hierbei aber in eine Höhe jenseits von Gut und Böse ansteigen und für eine fliessende Darstellung in Echtzeit wird es vermutlich kaum ausreichen und unbrauchbar sein. Confused

Xaron

BeitragDi, Feb 07, 2006 10:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Für sowas wären Shader Klasse. Aber die gibt's ja leider nicht in DirectX7...

Gruß - Xaron
Cerberus X - Monkey X Reloaded!
 

Klaas

BeitragDi, Feb 07, 2006 12:51
Antworten mit Zitat
Benutzer-Profile anzeigen
und um deine Frage wirklich zu beantworten.

Zitat:
Weiß jmand von euch welche Berechnungen hinter dem Beleuchtungssystem von Blitz3D steckt ?


Blitz verwendet einfaches "Vertex Lighting"
 

Dreamora

Betreff: Re: Function der Beleuchtung in Blitz3D

BeitragDi, Feb 07, 2006 13:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Fuchsi hat Folgendes geschrieben:
Weiß jmand von euch welche Berechnungen hinter dem Beleuchtungssystem von Blitz3D steckt ?


Eigentlich garkeine, für Lichter werden DX Hardwarelichter verwendet, welche Vertices entsprechend ihrer Position und Normale "belichtet".
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Fuchsi

BeitragDi, Feb 07, 2006 15:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Stimmt schon, nur hab ich gemeint wie "Vertrex Lighting" functioniert, aber das hat Ava ja scon gut erklärt. Very Happy

Thx Fuchsi !

EDIT//: Muss nochmal fragen. Gibt es wirklich kostenlose Schattenengines ?
 

Dreamora

BeitragDi, Feb 07, 2006 17:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Nein, keine die Schatten deiner Objekte in Echtzeit werfen zumindest. Die Stencil Lib als auch Sswifts Schattensystem kosten Geld.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Black Spider

BeitragDi, Feb 07, 2006 18:05
Antworten mit Zitat
Benutzer-Profile anzeigen
hab da n code für dich, den du ganz gut gebrauchen könntest. (Hab ich kostenlos irgendwo gefunden):
(KA ob der Funzt, oder ob du den Fixen musst):
Code: [AUSKLAPPEN]
;Simple SchattenDemo von Inarie
;www.projectblitz.de
;www.inarie.de


Graphics3D 800,600,32,1
SetBuffer BackBuffer()

;kamera
piv = CreatePivot()
cam = CreateCamera(piv)

MoveEntity cam,0,0,-10
PointEntity cam,piv


;heightmap... wird hier als texture und displacementzeugs genutzt
heightmap = LoadTexture("heightmap.bmp")

;ein hübsches bodenmesh aus sucox code geklaut ;)
mesh = CreateBoden(30,30)
ScaleMesh mesh,.2,.2,.2

; ein paar cylinder, die durch die luft fliegen
cubes = CreateMesh()
For i = 0 To 2
   cube = CreateCylinder(3)
   ScaleMesh cube,.8,.8,.8
   PositionMesh cube,Rnd(2,18)-10,.5,Rnd(2,18)-10
   RotateMesh cube,Rand(-20,20),Rand(360),Rand(-20,20)
   AddMesh(cube, cubes)
   FreeEntity cube
Next

ScaleMesh mesh,8,8,8
ScaleMesh cubes,2,2,2

PositionEntity mesh,0,-10,0

meshbrushwhite = CreateBrush(255,255,255)
BrushFX meshbrushwhite,1
meshbrush = CreateBrush(255,255,255)
BrushTexture meshbrush,heightmap,0,1

cubebrushwhite = CreateBrush(255,255,255)
BrushFX cubebrushwhite,1
cubebrush = CreateBrush(255,255,255)
BrushTexture cubebrush,heightmap,0,1


;licht und lichtkamera
Global light = CreateLight(2)
PositionEntity light,25,25,0
LightColor light,10,10,10
AmbientLight 10,10,10

lightcam = CreateCamera(light)
HideEntity lightcam
CameraFogMode lightcam,1
CameraFogRange lightcam,35,150
CameraClsColor lightcam,255,255,255
CameraViewport lightcam,0,0,512,512
PointEntity lightcam,cubes
CameraViewport lightcam,0,0,512,512

CreateCube(lightcam); man will ja auch sehen, wo das licht ist ;)

;die zwei schattentexturen
;die texturen nutzen das zweite uvset!
stex = CreateTexture(512,512,256)
TextureBlend stex,2
TextureCoords stex,1
stex2 = CreateTexture(512,512,256)
TextureBlend stex2,2
TextureCoords stex2,1

;projektion
ProjUV(lightcam,mesh,512,0)
ProjUV(lightcam,cubes,512)

;displacement für hübsches terrain
EntityDisplace(mesh,heightmap,10,-1)


;coole, schattenwerfende kugeln ;)
kpiv = CreatePivot()
Global kugel[5]
For i = 0 To 5
   t = Rand(0,3)
   Select t
   Case 0
      kugel[i] = CreateSphere(8,kpiv)
   Case 1
      kugel[i] = CreateCube(kpiv)
   Case 2
      kugel[i] = CreateCone(7,1,kpiv)
   Case 3
      kugel[i] = CreateCylinder(7,1,kpiv)
   End Select
         
   ScaleEntity kugel[i],Rnd(2,3),Rnd(2,3),Rnd(2,3)
   RotateEntity kugel[i],Rand(360),Rand(360),Rand(360)
   PositionEntity kugel[i],Rand(-30,30),Rand(-30,30),Rand(-30,30)
Next
ScaleEntity kpiv,.5,.5,.5
PositionEntity kpiv,0,5,0



;mainloop
While Not KeyHit(1)
   If KeyHit(57) Then wire = 1- wire:WireFrame wire
   
   ;umherwerfen der objekte
   TurnEntity kpiv,.15,.5,.05
   TurnEntity cubes,.1,0,0
   
   PointEntity light,cubes
   PointEntity lightcam,cubes
   MoveEntity light,-.2,0,0
   
   ;projektion der schattenuvkoordinaten
   ProjUV(lightcam,cubes,512)
   ProjUV(lightcam,mesh,512)
   
   ;anmalen der entities in der farbe, die ihr schatten haben soll
   PaintSpheres(100,100,100,1)
   PaintEntity mesh,meshbrushwhite
   PaintEntity cubes,cubebrushwhite
   
   ;schatten für die cubes rendern
   RenderShadow(lightcam,cam,stex)
   
   ;da die cubes schatten auf das terrain werfen sollen, müssen sie jetzt auch angemalt werden
   EntityColor cubes,100,100,100
   EntityFX cubes,1
   
   ;rendern der schatten auf dem terrain
   RenderShadow(lightcam,cam,stex2)
   
   ;alles in den farben anmalen, in denen es gerendert werden soll und schattentexturen draufpacken
   PaintEntity mesh,meshbrush
   PaintEntity cubes,cubebrush
   EntityTexture mesh,stex2,0,2
   EntityTexture cubes,stex,0,2
   PaintSpheres(255,255,255,0,heightmap)
   
   ;rendern
   RenderWorld
   
   If KeyHit(2) Then FlushKeys : WaitKey()
   
   ;kamerasteuerung
   TurnEntity piv,KeyDown(200)-KeyDown(208),KeyDown(205)-KeyDown(203),0
   MoveEntity cam,0,0,KeyDown(30)-KeyDown(44)
   RotateEntity piv,EntityPitch(piv),EntityYaw(piv),0
   
   Text 0,0,Util_Fps()
   ;Text 0,20,TrisRendered()
   
   Flip 0 ; flip0, damit man die tatsächlichen fps sieht
Wend
End


Function ProjUV(cam,mesh,width#,set=1)  ; diese funktion passt die vertexkoordinaten an die projektion der kamera an
   RotateEntity cam,EntityPitch(cam),EntityYaw(cam),0
   For s = 1 To CountSurfaces(mesh)
      sur = GetSurface(mesh,s)
      For ve = 1 To CountVertices(sur)-1
         x# = VertexX(sur,ve)
         y# = VertexY(sur,ve)
         z# = VertexZ(sur,ve)
         
         TFormPoint x#,y#,z#,mesh,0
         x# = TFormedX#()
         y# = TFormedY#()
         z# = TFormedZ#()
         
         CameraProject(cam,x#,y#,z#)
         u# = ProjectedX#()/width#
         v# = ProjectedY#()/width#
         
         VertexTexCoords sur,ve,u#,v#,0,set
      Next
   Next
End Function


Function PaintSpheres(r,g,b,fx,tex=0) ; färbt die ganzen kugeln ein (hätt' ich die doch bloß mit addmesh zusammengefügt! ;))
   For i = 0 To 15
      TurnEntity kugel[i],.2,.1,0
      EntityColor kugel[i],r,g,b
      EntityFX kugel[i],fx
      If tex Then EntityTexture kugel[i],tex
   Next
   EntityColor kugel[5],120,0,0
   EntityAlpha kugel[5],.5
End Function


Function RenderShadow(cam,hcam,tex) ; rendert die schattentextur
   ShowEntity cam
   HideEntity hcam
   size = TextureWidth(tex)
   
   CameraViewport cam,0,0,size,size
   
   UpdateWorld
   RenderWorld
   
   CopyRect 0,0,size,size,0,0,BackBuffer(),TextureBuffer(tex)
   
   HideEntity cam
   ShowEntity hcam
End Function


Function CreateBoden(xstep = 20, zStep = 20) ; erstellt einen wunderschönen suco-x boden ;)
   Local final_mesh = CreateMesh()
   Local final_surface = CreateSurface(final_mesh)
   Local vertex[5]
   
   
   For x = 0 To xstep-1
      For z = 0 To zStep-1     
         vertex[0] = AddVertex(final_surface,x-xstep/2,0,z-zStep/2,0,0)
         vertex[1] = AddVertex(final_surface,x-xstep/2,0,z-zStep/2-1,0,1)
         vertex[2] = AddVertex(final_surface,x-xstep/2+1,0,z-zStep/2-1,1,1)
         
         vertex[3] = AddVertex(final_surface,x-xstep/2,0,z-zStep/2,0,0)
         vertex[4] = AddVertex(final_surface,x-xstep/2+1,0,z-zStep/2,1,0)
         vertex[5] = AddVertex(final_surface,x-xstep/2+1,0,z-zStep/2-1,1,1)
         
         AddTriangle(final_surface, vertex[2], vertex[1], vertex[3])
         AddTriangle(final_surface, vertex[3], vertex[4], vertex[5])
         
         
      Next
   Next
   
   UpdateNormals(final_mesh)
   
   Return final_mesh
End Function


Function EntityDisplace(mesh,tex,scale#=1,diff#=0,updanormals=1) ; verschiebt vertices anhand ihrer uv in normalrichtung
   twidth   = TextureWidth(tex)-1                        ; wird weithin displacementmapping genannt ;)
   theight = TextureHeight(tex)-1
   
   LockBuffer TextureBuffer(tex)
   
   For s = 1 To CountSurfaces(mesh)
      sur = GetSurface(mesh,s)
      For ver = 0 To CountVertices(sur)-1
         c = ReadPixelFast(VertexU(sur,ver)*twidth,VertexV(sur,ver)*theight,TextureBuffer(tex))
         move# = Float#((c And $FF0000)/$10000)/255.00+diff#
         nx# = VertexX(sur,ver)+(VertexNX(sur,ver))*move*scale#
         ny# = VertexY(sur,ver)+(VertexNY(sur,ver))*move*scale#
         nz# = VertexZ(sur,ver)+(VertexNZ(sur,ver))*move*scale#
         VertexCoords sur,ver,nx,ny,nz
      Next
   Next
   
   UnlockBuffer TextureBuffer(tex)
   
   If updanormals Then UpdateNormals mesh
End Function


Global fps_frames,fps_ms=MilliSecs(),fps_anzeige#      ; zeigt nur die fps an
Function Util_Fps()
   fps_frames=fps_frames+1
   If MilliSecs()-fps_ms >= 1000 Then
      fps_anzeige=fps_frames
      fps_frames=0
      fps_ms=MilliSecs()
   EndIf
   Return fps_anzeige
End Function


recht simpel, aber nützlich.[/syntax]
Coming soon:
http://img132.imageshack.us/im...im2ab6.gif

TheProgrammer

BeitragMi, Feb 08, 2006 16:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi.

Wenn dir statische Lichtquellen reichen, würde ich dir lightmaps empfehlen. Da werden die Beleuchtungen und Schatten vorher berechnet und es werden lightmaps erstellt, die dann einfach über die Entitys drüber gelegt werden können.

Lightmapper findest du z.B. auf BlitzBasic.com (YAL wäre zu empfehlen.)

Mfg
TheProgrammer
aktuelles Projekt: The last day of human being

aMul

Sieger des Minimalist Compo 01/13

BeitragMi, Feb 08, 2006 16:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Black Spider hat Folgendes geschrieben:
Hab ich kostenlos irgendwo gefunden

Black Spider hat Folgendes geschrieben:

Code: [AUSKLAPPEN]
;Simple SchattenDemo von Inarie
;www.projectblitz.de
;www.inarie.de
...

...^^

Achja, es geht!
Aber is nicht das schnellste...

Hab auch "irgendwo" was gefunden, und das war glaub ich schneller.
Wenn ichs finde sach ich Bescheid^^

MfG
Panic Pong - ultimate action mashup of Pong and Breakout <= aktives Spiele-Projekt, Downloads mit vielen bunten Farben!
advASCIIdraw - the advanced ASCII art program <= aktives nicht-Spiele-Projekt, must-have für ASCII/roguelike/dungeon-crawler fans!
Alter BB-Kram: ThroughTheAsteroidBelt - mit Quelltext! | RGB-Palette in 32²-Textur / Farbige Beleuchtung mit Dot3 | Stereoskopie in Blitz3D | Teleport-Animation Screensaver

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group