[B3D] Echtzeitreflexion

Übersicht BlitzBasic Codearchiv

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen

Nicdel

Betreff: [B3D] Echtzeitreflexion

BeitragDo, Okt 15, 2009 17:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Da mir gerade langweilig war und ich nicht von Cubemaps wegkomme hab ich ein paar Funktionen geschrieben, mit denen auch Anfänger leicht reflektierende Objekte erstellen können.

Bild:
user posted image

Reflections.bb:
BlitzBasic: [AUSKLAPPEN]

;Reflexionstype
Type Reflection

Field camera

Field tex

Field entity, re

Field update,time, ur

End Type


;Erstellt eine neue Reflexion. Parameter:
;entity: Das Entity, das die Reflexion bekommen soll
;cam: Normalerweise die Spielerkamera, andere Objekte sind auch möglich
;tex_size: Die Texturgröße (am Besten zwischen 128x128 und 1024x1024)
;update: Die Zeit zwischen 2 Updates (je größer, desto schneller läuft das Programm)
Function CreateReflection(entity, cam, tex_size,update=10)

rf.Reflection = New Reflection

rf\entity = cam

rf\re = entity

rf\camera = CreateCamera()

rf\tex = CreateTexture(tex_size,tex_size,1 + 128 + 256)

rf\update = update

rf\ur = 1

EntityTexture entity,rf\tex

End Function


;Entfernt die Reflexion von einem Entity. Parameter:
;entity: Ein Entity mit Reflexion
;new_tex: Handle der neuen Textur. Ist dieser Parameter 0, wird eine weiße Textur verwendet, ist er -1 wird keine neue Textur verwendet
Function RemoveReflection(entity, new_tex = -1)

For rf.Reflection = Each Reflection

If rf\re = entity

FreeEntity rf\camera

FreeTexture rf\tex

If new_tex > 0

EntityTexture entity,new_tex

ElseIf new_tex = 0

white_tex = CreateTexture(1,1)

WritePixel 0,0,$FFFFFF,TextureBuffer(white_tex)

EntityTexture entity,white_tex

FreeTexture white_tex

EndIf

Delete rf

Exit

EndIf

Next

End Function


;Schaltet das Updaten der Reflexion eines Entities aus oder ein. Parameter:
;entity: Entity mit Reflexion
;update: Update ein- oder ausschalten (1/0)
Function ReflectionState(entity,update)

For rf.Reflection = Each Reflection

If rf\re = entity

rf\ur = update

Exit

EndIf

Next

End Function


;Diese Funktion aktualisiert alle Reflexionen. Sie sollte in der Hauptschleife aufgerufen werden.
Function UpdateReflections()

For rf.Reflection = Each Reflection

If MilliSecs()-rf\time > rf\update And rf\ur = 1 And EntityInView(rf\re,rf\entity)

tex_sz = TextureWidth(rf\tex)

ShowEntity rf\camera
HideEntity rf\entity
PositionEntity rf\camera, EntityX#(rf\entity), EntityY#(rf\entity), EntityZ#(rf\entity)
CameraClsMode rf\camera, False, True
CameraViewport rf\camera, 0, 0, tex_sz, tex_sz

SetCubeFace rf\tex, 0
RotateEntity rf\camera, 0, 90, 0
RenderWorld
CopyRect 0, 0, tex_sz, tex_sz, 0, 0, BackBuffer(), TextureBuffer(rf\tex)

SetCubeFace rf\tex, 1
RotateEntity rf\camera, 0, 0, 0
RenderWorld
CopyRect 0, 0, tex_sz, tex_sz, 0, 0, BackBuffer(), TextureBuffer(rf\tex)

SetCubeFace rf\tex, 2
RotateEntity rf\camera, 0, - 90, 0
RenderWorld
CopyRect 0, 0, tex_sz, tex_sz, 0, 0, BackBuffer(), TextureBuffer(rf\tex)

SetCubeFace rf\tex, 3
RotateEntity rf\camera, 0, 180, 0
RenderWorld
CopyRect 0, 0, tex_sz, tex_sz, 0, 0, BackBuffer(), TextureBuffer(rf\tex)

SetCubeFace rf\tex, 4
RotateEntity rf\camera, - 90, 0, 0
RenderWorld
CopyRect 0, 0, tex_sz, tex_sz, 0, 0, BackBuffer(), TextureBuffer(rf\tex)

SetCubeFace rf\tex, 5
RotateEntity rf\camera, 90, 0, 0
RenderWorld
CopyRect 0, 0, tex_sz, tex_sz, 0, 0, BackBuffer(), TextureBuffer(rf\tex)

ShowEntity rf\entity
HideEntity rf\camera

rf\time = MilliSecs()

EndIf

Next

End Function



Beispiel:
BlitzBasic: [AUSKLAPPEN]



SeedRnd(MilliSecs())

Graphics3D 1680,1050,32,1


cam = CreateCamera()

PositionEntity cam, 0, 10, - 10


light = CreateLight()

RotateEntity light, 90, 0, 0


prim1 = LoadMesh("teapot.x")

PositionEntity prim1, 0, 10, 0

ScaleEntity prim1,3,3,3

EntityFX prim1,1

CreateReflection(prim1, cam, 128, 10)

reflect_update = 1

factor = 7


ground = CreatePlane()

EntityColor ground,103,140,50

ground_tex = LoadTexture("mountain.jpg")

ScaleTexture ground_tex, 10, 10

EntityTexture ground, ground_tex


sky = CreateSphere(16)

ScaleEntity sky, 500, 500, 500

FlipMesh sky

EntityFX sky, 1

sky_tex = LoadTexture("sky2.jpg")

EntityTexture sky, sky_tex



test_obj1 = CreateCylinder()

FitMesh test_obj1, - 10, 0, - 10, 5,9,7

EntityColor test_obj1, 255,200,0

test_obj2 = CreateCone()

FitMesh test_obj2, 10, 0, 10, 6, 7, 8

EntityColor test_obj2,100,150,255

test_piv = CreatePivot()

PositionEntity test_piv, 0, 15, 0

test_obj3 = CreateSphere(16,test_piv)

ScaleEntity test_obj3,1,0.2,1

PositionEntity test_obj3, 0, 0, 10


SetBuffer BackBuffer()

timer = CreateTimer(60)

Color 0,0,0


While Not KeyDown(1)


mxs# = mxs# + (MouseXSpeed() / 5.0)

mys# = mys# + (MouseYSpeed() / 5.0)

RotateEntity cam, mys#, - mxs#, 0

MoveMouse GraphicsWidth()/2,GraphicsHeight()/2


If KeyDown(17) MoveEntity cam, 0, 0, 0.6

If KeyDown(31) MoveEntity cam, 0, 0, -0.6

If KeyDown(32) MoveEntity cam, 0.6, 0, 0

If KeyDown(30) MoveEntity cam, -0.6, 0, 0

If KeyHit(200)

If factor < 10 factor = factor + 1

RemoveReflection(prim1)

CreateReflection(prim1, cam, 2^factor, 10)

EndIf

If KeyHit(208)

If factor > 0 factor = factor - 1

RemoveReflection(prim1)

CreateReflection(prim1, cam, 2^factor, 10)

EndIf

If KeyHit(57) reflect_update = 1-reflect_update: ReflectionState(prim1, reflect_update)


TurnEntity prim1,0,1,0

TurnEntity test_piv, 0, 2, 0


UpdateReflections()

RenderWorld


PositionEntity sky,EntityX(cam),0,EntityZ(cam)

tsz = 2^factor

;FPS-Anzeige von hectic
ms=MilliSecs():Text 0,0,"FPS: "+fps+" | Texturauflösung: "+tsz+"x"+tsz
If ms>mt mt=ms+502:fps=frame:frame=0 Else frame=frame+2


Flip 0


If Not KeyDown(29) WaitTimer(timer)


Wend


End


Steuerung:
ADSW: Bewegen
Leertaste: Aktualisieren ein-/ausschalten
Hoch/Runter (Pfeiltasten): Cubemapgröße ändern
Steuerung Links: Timer ausschalten (Geschwindigkeitstest)

Zu beachten ist, dass bei einer Auflösung die kleiner als 1024x1024 ist auch keine Cubemap mit der Größe 1024x1024 verwendet werden darf.

Externe Ressourcen:
Komplettpaket
Desktop: Intel Pentium 4 2650 Mhz, 2 GB RAM, ATI Radeon HD 3850 512 MB, Windows XP
Notebook: Intel Core i7 720 QM 1.6 Ghz, 4 GB DDR3 RAM, nVidia 230M GT, Windows 7
  • Zuletzt bearbeitet von Nicdel am Do, Okt 15, 2009 17:28, insgesamt 2-mal bearbeitet

D2006

Administrator

BeitragDo, Okt 15, 2009 17:12
Antworten mit Zitat
Benutzer-Profile anzeigen
*hust*krümelkack*hust*

Reflexion.
Intel Core i5 2500 | 16 GB DDR3 RAM dualchannel | ATI Radeon HD6870 (1024 MB RAM) | Windows 7 Home Premium
Intel Core 2 Duo 2.4 GHz | 2 GB DDR3 RAM dualchannel | Nvidia GeForce 9400M (256 MB shared RAM) | Mac OS X Snow Leopard
Intel Pentium Dual-Core 2.4 GHz | 3 GB DDR2 RAM dualchannel | ATI Radeon HD3850 (1024 MB RAM) | Windows 7 Home Premium
Chaos Interactive :: GoBang :: BB-Poker :: ChaosBreaker :: Hexagon :: ChaosRacer 2

Nicdel

BeitragDo, Okt 15, 2009 17:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke Dee, ich hab's verbessert. Wobei ich immer noch denke, dass sich Reflektion besser schreibt Very Happy
Desktop: Intel Pentium 4 2650 Mhz, 2 GB RAM, ATI Radeon HD 3850 512 MB, Windows XP
Notebook: Intel Core i7 720 QM 1.6 Ghz, 4 GB DDR3 RAM, nVidia 230M GT, Windows 7

Silver_Knee

BeitragDo, Okt 15, 2009 21:29
Antworten mit Zitat
Benutzer-Profile anzeigen
seit wann schreibt man das den so? Schreibe ich jetzt Reflektor auch anders?

Starwar

BeitragDo, Okt 15, 2009 21:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Nö, nur Reflexion. Reflektor, Reflektieren,.. mit k.
Doofe deutsche Sprache.
MFG
 

n-Halbleiter

BeitragDo, Okt 15, 2009 21:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Silver_Knee hat Folgendes geschrieben:
Schreibe ich jetzt Reflektor auch anders?


Alles, was vom Nomen "Reflexion" kommt, bleibt beim "x". Alles, was vom Verb "reflektieren" herkommt - also dein "Reflektor" (Reflektor ist durch. Substantivierung od. Nominalisierung entstanden) - wird mit "kt" geschrieben.

Starwar hat Folgendes geschrieben:
Doofe deutsche Sprache.


Beizeiten ziemlich verwirrend und kompliziert, das stimmt schon...
mfg, Calvin
Maschine: Intel Core2 Duo E6750, 4GB DDR2-Ram, ATI Radeon HD4850, Win 7 x64 und Ubuntu 12.04 64-Bit
Ploing!
Blog

"Die Seele einer jeden Ordnung ist ein großer Papierkorb." - Kurt Tucholsky (09.01.1890 - 21.12.1935)

ozzi789

BeitragFr, Okt 16, 2009 7:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Zum Topic..
Sieht echt ganz nett aus, und is schnell dazu Cool
0x2B || ! 0x2B
C# | C++13 | Java 7 | PHP 5

TimBo

BeitragFr, Okt 16, 2009 11:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,

sieht ja echt super nice aus !

ich habe mal versucht den schönen Quelltext zu durchforsten. Nur finde ich immer noch nicht heraus, was denn jetzt der Trick bei einer solchen Reflexion ist. Ich gehe davon aus, dass du 2 Kameras hast, aber woher weiß die 2te Kamera von wo sie rendern soll und wie geht das mit dem gerenderten auf die Textur ?

Wäre nett wenn mir das jemand erklären könnte Smile

Grüße
TimBo
mfg Tim Borowski // CPU: Ryzen 2700x GPU: Nvidia RTX 2070 OC (Gigabyte) Ram: 16GB DDR4 @ 3000MHz OS: Windows 10
Stolzer Gewinner des BCC 25 & BCC 31
hat einen ersten Preis in der 1. Runde beim BWInf 2010/2011 & 2011/12 mit BlitzBasic erreicht.

skey-z

BeitragFr, Okt 16, 2009 14:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Die Kamera positionierst du an der Position des Objektes welches die Cubemap erhalten soll

Wie das mit der Textur ist, siehst du in der Hilfe SetCubeFace
Awards:
Coffee's Monatswettbewerb Feb. 08: 1. Platz
BAC#57: 2. Platz
Twitter

Badudel

BeitragMo, Nov 16, 2009 13:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Dein Screenshot sieht besser aus, als bei mir. Bei mir ist die Kanne schwarz mit einem kleinen Flecken Gras in der Mitte - was mach ich falsch?
Wir werden dem Schwein schon schlachten, auch wenn ihm quiekt.
Zum Teufel mit das Grammatik!

Nicdel

BeitragMo, Nov 16, 2009 18:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Was für eine Grafikkarte hast du? Da kann es zu Problemen kommen...
Desktop: Intel Pentium 4 2650 Mhz, 2 GB RAM, ATI Radeon HD 3850 512 MB, Windows XP
Notebook: Intel Core i7 720 QM 1.6 Ghz, 4 GB DDR3 RAM, nVidia 230M GT, Windows 7

Badudel

BeitragDi, Nov 17, 2009 11:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe einen Macbook, auf dem ich auch Windows laufen habe ( Crying or Very sad )

Das Ding heißt Mobile Intel 965 Express Chipset Family.

Schade, dass das bei mir nicht geht, sieht nämlich echt cool auf dem Screen aus.

Gruß!
Wir werden dem Schwein schon schlachten, auch wenn ihm quiekt.
Zum Teufel mit das Grammatik!

the FR3AK

BeitragMi, Nov 18, 2009 3:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Badudel hat Folgendes geschrieben:

Das Ding heißt Mobile Intel 965 Express Chipset Family.


Uhje, kein Wunder! Die Intel Chipset "Grafikkarten" kennen sowas wie Reflexion leider noch nicht! Ebenso wenig wie Shader.

Nicdel

BeitragMi, Nov 18, 2009 9:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Das Witzige ist, dass es sogar auf meiner 3 Jahre alten Notebook Grafikkarte von VIA funktioniert. Und die ist auch im Chipset (allerdings nur mit ca. 10 FPS Smile)
Desktop: Intel Pentium 4 2650 Mhz, 2 GB RAM, ATI Radeon HD 3850 512 MB, Windows XP
Notebook: Intel Core i7 720 QM 1.6 Ghz, 4 GB DDR3 RAM, nVidia 230M GT, Windows 7
 

Coffee

BeitragMi, Nov 18, 2009 14:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Der Intel-Chip kann doch sogar DX10 & Shader Model 4 oder nicht?
*Mjam*

Alkan

Betreff: ???

BeitragMo, Jan 11, 2010 16:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Irgendwie funktioniert das bei mir nicht!
Da steht immer:
Zitat:
function 'createreflection' not found
Shocked
und wenn ich reflexion schreibe:
Zitat:
function 'createreflexion' not found
Shocked
Ich habe alles auf version 1.94(also IDE ...)
Kann mir jemand helfen? Question
MfG
Alkan
Hauptrechner: Win7 Ultimate x64|AMD Phenom II X4 965 BlackEdition 4x3.4GHz|4 GB DualKit DDR3-1600 Ram|1.5 TB Samsung EcoGreen|Cougar CM 700Watt|ASRock M3A790GFX/120M|Nvidia GeForce 9500GT|Ati Radeon HD3300(Onboard-Deaktiviert)
Server(früher Hauptrechner): Ubuntu 9.1 x86|Intel P4 HT 3GHz|Ati Radeon X600Pro|200 GB HDD
Worklog: Planetensimulation
Homepage(Under Construction): alkan96.dyndns.org
Wenn schon falsch, dann richtig falsch.

biggicekey

BeitragMo, Jan 11, 2010 16:47
Antworten mit Zitat
Benutzer-Profile anzeigen
aktualisiere auf die aktuellste Version und dir wird bestimmt jemand helfen können.
#45 www.icekeyunlimited.de www.starcrusade.de
Gewinner BCC#17 !!! mit dotkiller
Nothing more to register - you've cleaned us out![/size]

Alkan

Betreff: Aktuelle Blitz3D Version?

BeitragMo, Jan 11, 2010 16:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Welche Version von Blitz3D ist denn die neueste?
Hauptrechner: Win7 Ultimate x64|AMD Phenom II X4 965 BlackEdition 4x3.4GHz|4 GB DualKit DDR3-1600 Ram|1.5 TB Samsung EcoGreen|Cougar CM 700Watt|ASRock M3A790GFX/120M|Nvidia GeForce 9500GT|Ati Radeon HD3300(Onboard-Deaktiviert)
Server(früher Hauptrechner): Ubuntu 9.1 x86|Intel P4 HT 3GHz|Ati Radeon X600Pro|200 GB HDD
Worklog: Planetensimulation
Homepage(Under Construction): alkan96.dyndns.org
Wenn schon falsch, dann richtig falsch.

jokerman29

BeitragMo, Jan 11, 2010 16:57
Antworten mit Zitat
Benutzer-Profile anzeigen
ich probiers gleich aus aber auf den bildern siehts geil aus Wink

die neusten versionen:
B3D 1.103
B3D SDK 1.05
WhY sO sErIoUs? LeT´s PuT a SmIlE oN tHaT fAcE!

Rechtschreibfehler sind special-effekts meiner Tastatur Wink

Nicdel

BeitragMo, Jan 11, 2010 16:58
Antworten mit Zitat
Benutzer-Profile anzeigen
1.103 ist die neuste.
Dein Problem ist aber ein anderes: Du hast nur das Beispiel kopiert! Du musst natürlich auch die obere Datei dazukopieren, also unter das Beispiel oder in einer anderen Datei abspeichern und diese includen.
Desktop: Intel Pentium 4 2650 Mhz, 2 GB RAM, ATI Radeon HD 3850 512 MB, Windows XP
Notebook: Intel Core i7 720 QM 1.6 Ghz, 4 GB DDR3 RAM, nVidia 230M GT, Windows 7

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group