DoF - Schönheitstipps

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

Chrise

Betreff: DoF - Schönheitstipps

BeitragSa, Feb 28, 2009 21:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo!

Ich habe ein bisschen mit Depth of Field rumprobiert.

Jetzt habe ich vor erstmal grafisch so viel rauszuholen wie möglich und danach performancetechnisch.
Das Ergebnis ist.... sagen wir.... akzeptabel, aber nicht wirklich das, was man schön nennt.
Darum wollte ich fragen, ob jemand von euch Tipps hat, das ganze an den entscheidenden Stellen weicher zu machen, aber am Focus doch scharf bleiben lässt.
Wäre euch wirklich dankbar, mir fällt einfach nichts ein, was man da mache könnte....

Einfach mit der Maus auf die jeweiligen Cubes gehen um darauf scharf zu stellen.
Nummernblock 8 oder 2 Focus manuell ändern.
Pfeiltasten oben und unten Camera vor oder zurück bewegen.

Code: [AUSKLAPPEN]

timer=CreateTimer(25)
SeedRnd MilliSecs()
Graphics3D 1024,768,0,2

size=512
alpha#=0.5
w#=0.1
blend=1
focus#=15
order=-1
dof=0

light=CreateLight()
camera=CreateCamera()
CameraRange camera,0.1,1000
PositionEntity camera,0,0,-7

If dof=1 Then
   dof_tex=CreateTexture(size,size)
   dof_screen=CreateCube(camera)
   EntityTexture dof_screen,dof_tex
   PositionEntity dof_screen,0,0,2
   EntityAlpha dof_screen,0.3
   EntityOrder dof_screen,-2
EndIf

pivot=CreateSphere(8,camera)
EntityColor pivot,255,155,0
PositionEntity pivot,0,0,15
ScaleEntity pivot,0.1,0.1,0.1

camera_l=CreateCamera(camera)
CameraRange camera_l,0.1,1000
PositionEntity camera_l,-w#,0,0
PointEntity camera_l,pivot
CameraProjMode camera_l,0
CameraViewport camera_l,0,0,size,size
l_tex=CreateTexture(size,size,8)
l_screen=CreateCube(camera)
EntityTexture l_screen,l_tex
PositionEntity l_screen,0,0,2
EntityAlpha l_screen,alpha#
HideEntity l_screen
EntityOrder l_screen,order
EntityBlend l_screen,blend

camera_r=CreateCamera(camera)
CameraRange camera_r,0.1,1000
PositionEntity camera_r,w#,0,0
PointEntity camera_r,pivot
CameraProjMode camera_r,0
CameraViewport camera_r,0,0,size,size
r_tex=CreateTexture(size,size,8)
r_screen=CreateCube(camera)
EntityTexture r_screen,r_tex
PositionEntity r_screen,0,0,2
EntityAlpha r_screen,alpha#
HideEntity r_screen
EntityOrder r_screen,order
EntityBlend r_screen,blend

camera_u=CreateCamera(camera)
CameraRange camera_u,0.1,1000
PositionEntity camera_u,0,w#,0
PointEntity camera_u,pivot
CameraProjMode camera_u,0
CameraViewport camera_u,0,0,size,size
u_tex=CreateTexture(size,size,8)
u_screen=CreateCube(camera)
EntityTexture u_screen,u_tex
PositionEntity u_screen,0,0,2
EntityAlpha u_screen,alpha#
HideEntity u_screen
EntityOrder u_screen,order
EntityBlend u_screen,blend

camera_d=CreateCamera(camera)
CameraRange camera_d,0.1,1000
PositionEntity camera_d,0,-w#,0
PointEntity camera_d,pivot
CameraProjMode camera_d,0
CameraViewport camera_d,0,0,size,size
d_tex=CreateTexture(size,size,8)
d_screen=CreateCube(camera)
EntityTexture d_screen,d_tex
PositionEntity d_screen,0,0,2
EntityAlpha d_screen,alpha#
HideEntity d_screen
EntityOrder d_screen,order
EntityBlend d_screen,blend

Dim cube(20)
For i=0 To 20
   cube(i)=CreateCube()
   PositionEntity cube(i),Rnd(-5,5),Rnd(-5,5),Rnd(-5,20)
   ScaleEntity cube(i),Rnd(0.1,1),Rnd(0.1,1),Rnd(0.1,1)
   EntityPickMode cube(i),2,1
Next

SetBuffer BackBuffer()
While Not KeyHit(1)
   CameraPick(camera,MouseX(),MouseY())
   p=CameraPick(camera,MouseX(),MouseY())
   If p>0 Then
      dist#=EntityDistance(camera,p)
      focus#=focus#+((dist#)-focus#)/6
   Else
      focus#=focus#+(7-focus#)/1000
   EndIf
   
   If KeyDown(72) Then focus#=focus#+0.1
   If KeyDown(80) Then focus#=focus#-0.1
   If focus#<0.5 Then focus#=0.5
   
   PositionEntity pivot,0,0,focus#
   PointEntity camera_l,pivot
   PointEntity camera_r,pivot
   PointEntity camera_u,pivot
   PointEntity camera_d,pivot

   If KeyDown(200) Then MoveEntity camera,0,0,0.1
   If KeyDown(208) Then MoveEntity camera,0,0,-0.1
   
   If dof=1 Then HideEntity dof_screen
   HideEntity l_screen
   HideEntity r_screen
   HideEntity u_screen
   HideEntity d_screen
   CameraProjMode camera,0
   CameraProjMode camera_l,1
   RenderWorld
   CopyRect 0,0,size,size,0,0,BackBuffer(),TextureBuffer(l_tex)
   CameraProjMode camera_l,0
   CameraProjMode camera_r,1
   RenderWorld
   CopyRect 0,0,size,size,0,0,BackBuffer(),TextureBuffer(r_tex)
   CameraProjMode camera_r,0
   CameraProjMode camera_u,1
   RenderWorld
   CopyRect 0,0,size,size,0,0,BackBuffer(),TextureBuffer(u_tex)
   CameraProjMode camera_u,0
   CameraProjMode camera_d,1
   RenderWorld
   CopyRect 0,0,size,size,0,0,BackBuffer(),TextureBuffer(d_tex)
   CameraProjMode camera_d,0
   ShowEntity l_screen
   ShowEntity r_screen
   ShowEntity u_screen
   ShowEntity d_screen
   If dof=1 Then ShowEntity dof_screen
   CameraProjMode camera,1
   If dof=1 Then
      CameraViewport camera,0,0,size,size
      RenderWorld
      CopyRect 0,0,size,size,0,0,BackBuffer(),TextureBuffer(dof_tex)
      CameraViewport camera,0,0,GraphicsWidth(),GraphicsHeight()
   EndIf
   RenderWorld
   
   Text 50,50,EntityDistance(pivot,camera)
   WaitTimer timer
   Flip 0
Wend
End
 

TerrorMachine

BeitragSo, März 01, 2009 0:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Nach 29 Sekunden krieg ich jedes mal nen MAV bei RenderWorld.
Ist dabei egal, ob ich die Maus Bewege oder ob ich still stehe.

Chrise

BeitragSo, März 01, 2009 3:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Höh? Das ist komisch... bei mir funktioniert es zumindest vom technischen her einwandfrei.
Ich werds mir nochmal anschauen und dann den Code nachliefern. Ich gehe nun jedenfalls davon aus, dass dein PC gut genug für das Programm ist Very Happy

Megamag

BeitragSo, März 01, 2009 11:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Hey Chrise!
Ich finde das in Ordnung und bekomme auch keine Fehler.
Ich hätte aber einen Tipp für dich. Du könntest vielleicht noch Blur drübersetzten, denn
es sieht manchmal ziemlich unschön aus, wenn in der Ferne die Blöcke so weit auseinander gehen,
dass sie schon fast neben einander stehen Wink

Chrise

BeitragSo, März 01, 2009 15:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo Blitz4D!
Danke schon jetzt, dass du eine Antwort gibst Smile
Meinst du den Blur von Hectic? Oder hattest du da an einen anderen gedacht? Beim ersteren wäre vll das Problem, dass Scharfe Bereiche ebenfalls sehr unscharf zu sehen wären...
Wobei ich dir bei deiner Kritik völlig Recht gebe. Das war ja auch eigentlich der Grund, warum ich das Thema erstellt habe ^^

hectic

Sieger des IS Talentwettbewerb 2006

BeitragSo, März 01, 2009 15:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Ein Blur würde - wie du schon beschrieben hast - den kompletten Bildschirm verschleiern und somit das zuvor berechnete DoF größtenteils wieder kaputt machen. Eine Lösung fällt mir allerdings auch nicht ein.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

Noobody

BeitragSo, März 01, 2009 15:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Naja, die Idee, vier Kameras zu benutzen, ist zwar im Testbett nicht allzu schlecht, jedoch musst du bedenken, dass man später in der Spielsituation kaum genug Rechenzeit übrig hat, die ganze Szene vier mal zu rendern (da ein Rendervorgang manchmal schon zuviel Zeit verschlingt).
Schon jetzt ist es sehr langsam bei mir, da viermal ein Copyrect in eine 512er Textur ausgeführt wird.

Mit den vier Kameras bekommt man leider auch kein richtiges DoF hin - im Vergleich:
user posted image

In Spielen lässt sich das wohl nur mithilfe von Shadern in Echtzeit schaffen - in Blitz ist es sehr schwierig, da man ja auch keinen Zugriff auf den Z - Buffer hat.
Der Effekt sieht sicher nicht schlecht aus und ich will ihn dir auch nicht schlechtreden, aber in Blitz Basic muss man wohl oder übel auf solches Eye-Candy verzichten Razz
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun

Chrise

BeitragSo, März 01, 2009 15:43
Antworten mit Zitat
Benutzer-Profile anzeigen
@hectic: Jauw, das dachte ich mir eben auch, dann wird daraus jedenfalls nichts.

@Noobody: Ja, das vorallem war die Befürchtung von mir. In dem kleinen Test ist die Geschwindigkeit noch angemessen aber ich würde übles ahnen, wenn ich mir das in einer komplexeren 3D-Welt überlege. Ich habe genau wie dieses Beispielbild von Wikipedia versucht, eine Art Buchseite in Blitz3D darzustellen. Sah zwar gar nicht mal so schlecht aus, kam aber eben lange nicht an das gewünschte Ergebnis.
Och, schlechtreden macht bei diesem kleinen Test nichts aus ^^
War ja schließlich nur ein "Probierlerl". Aber du hast Recht, lieber drauf verzichten.
 

norc

BeitragSo, März 01, 2009 17:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Sonst könnte man vielleicht mit einem Delay-basierenden Motion-Blur ein DoF simlulieren, ich meine, Motion blur nur ausserhalb des Fokus. Da wären dann mehrere Quads vor der Kamera, alle nur einen Hauch sichtbar.

Eine zusätzliche Möglichkeit, ein Bild unscharf zu machen, ist, es in sehr niedriger Auflösung zu rendern, z.B.160*120, und dann auf das Screen Quad zu pappen. Macht man das DOF-mässig mit mehreren Stufen, so ergäbe sich wohl ein recht weicher Übergang.

Wie man aber von dem einen originalen Render eine kleinere skalierte Version bekommt (ohne viel Zeitverlust), das weiss ich auch grad nicht.

Vielleicht durch Rendern eines Quads, das mit dem Szenen-Render texturiert ist, in immer kleinerer Auflösung, und weitab der Szene. Bleibt immer noch das Copyrect in den Texturbuffer - könnte gut sein, dass eine halbierung der Grösse mit 2D Kommandos auf dem Backbuffer schneller geht.

Chrise

BeitragSo, März 01, 2009 17:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo Norc!

Hmm dein erster Vorschlag klingt interessant.

Das könnte man vielleicht realisieren. Das mit der Textur kleiner machen.... weiß nicht ob es da Probleme mit Treppenbildung gibt. Damit kenn ich mich leider nciht so aus ^^

Wie meinst du das mit den 2D Kommandos? Meinst du Scale bzw. Resize Image? Die wären zumindest laut Hilfe alles andere als Echtzeitfähig Razz

FireballFlame

BeitragSo, März 01, 2009 17:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Noobody hat Folgendes geschrieben:
In Spielen lässt sich das wohl nur mithilfe von Shadern in Echtzeit schaffen - in Blitz ist es sehr schwierig, da man ja auch keinen Zugriff auf den Z - Buffer hat.
Der Effekt sieht sicher nicht schlecht aus und ich will ihn dir auch nicht schlechtreden, aber in Blitz Basic muss man wohl oder übel auf solches Eye-Candy verzichten Razz

Stimmt nicht, FastExtensions hat z.B. Depth of Field unter seinen Postprocessing-Effekten.
Sieht natürlich nicht so gut aus wie das in Crysis, ist aber durchaus (auch vom Tempo her) zu gebrauchen.
FastExtensions' DOF-Beispielprogramm
Screenshot aus meinem Spiel

Chrise

BeitragSo, März 01, 2009 17:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Nette Screens. Die Fast-Extensions scheinen echt ziemlich gut zu sein! Hab ich nur leider nicht...

Noobody

BeitragSo, März 01, 2009 18:36
Antworten mit Zitat
Benutzer-Profile anzeigen
FireballFlame hat Folgendes geschrieben:
Stimmt nicht, FastExtensions hat z.B. Depth of Field unter seinen Postprocessing-Effekten.

Wie gesagt:
Noobody hat Folgendes geschrieben:
...in Blitz ist es sehr schwierig, da man ja auch keinen Zugriff auf den Z - Buffer hat.

Die FastExtensions hacken sich in den Arbeitsspeicher von Blitz und kriegen so Zugriff auf den Z-Buffer - etwas, was in Blitz nie möglich und auch per DLL sehr schwierig ist.
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun

Chrise

BeitragSo, März 01, 2009 18:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Noobody hat Folgendes geschrieben:

Die FastExtensions hacken sich in den Arbeitsspeicher von Blitz und kriegen so Zugriff auf den Z-Buffer - etwas, was in Blitz nie möglich und auch per DLL sehr schwierig ist.


Wäre es Ansich möglich, bzw. ist es schon einem gelungen?

blitzuser34

Betreff: Death of Field

BeitragSo, März 01, 2009 20:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,

vielleicht kannst du es ja gebrauchen, hab es mir bisher nur kurz angeschaut:

http://www.blitzcodebase.co.uk...dborg.html

Blitzuser34

Chrise

Betreff: Re: Death of Field

BeitragSo, März 01, 2009 20:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Lol genau den selben Code habe ich vor kurzem jemandem schon empfohlen ^^
D.h. ich hatte ihn mir schon vor der Idee es selbst auszuprobieren angeschaut. Thx trotzdem =)

FireballFlame

BeitragSo, März 01, 2009 21:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Das "stimmt nicht" bezog sich eher auf die Schlussfolgerung man müsse "auf solches Eye-Candy verzichten" Wink
PC: Intel Core i7 @ 4x2.93GHz | 6 GB RAM | Nvidia GeForce GT 440 | Desktop 2x1280x1024px | Windows 7 Professional 64bit
Laptop: Intel Core i7 @ 4x2.00GHz | 8 GB RAM | Nvidia GeForce GT 540M | Desktop 1366x768px | Windows 7 Home Premium 64bit

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group