Strukturen als Pointer an Funktionen übergeben
Übersicht

![]() |
LukasBananaBetreff: Strukturen als Pointer an Funktionen übergeben |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hi,
kann mir bitte jemand ein kleines Beispiel zeigen, wei man Strukturen (bzw. Type Fields) in Form eines Pointers an eine Funktion übergeben kann. Ich brauche das für meinen SPE Wrapper damit in Zunkunft nicht nur Direct3D9 sondern auch Direct3D11 genutzt werden kann. In dem Shader Model 4 und 5 können Konstanten nämlich nur noch in einer ganzen Struktur an die GPU übertragen werden. So stelle ich mir das vor: Code: [AUSKLAPPEN] Type Matrix4x4 Field m0n0#, m0n1#, m0n2#, m0n3# Field m1n0#, m1n1#, m1n2#, m1n3# Field m2n0#, m2n1#, m2n2#, m2n3# Field m3n0#, m3n1#, m3n2#, m3n3# End Type Type Vec4 Field X#, Y#, Z#, W# End Type Type MainConstantBuffer Field WorldViewProjectionMatrix.Matrix4x4 Field LightDirection.Vec4 Field DiffuseColor.Vec4 End Type ; SetShaderBuffer ist eine Funktion aus meinem Wrapper ; In PureBasic kann man mit @ den Pointer erhalten. Wie geht es in Blitz3D (bzw. BlitzBasic allgemein)? SetShaderBuffer(VertexShader, "MainBuffer", @MainConstantBuffer) Danke schon mal im Voraus ![]() |
||
Mein YouTube Channel: http://www.youtube.com/user/SoftPixel
Mein Twitter Profil: https://twitter.com/LukasBanana Meine Projekte auf github.com: https://github.com/LukasBanana Meine Projekte auf bitbucket.org: https://bitbucket.org/LukasBanana |
![]() |
Ana |
![]() Antworten mit Zitat ![]() |
---|---|---|
ich bin mir nicht sicher ob ich versteh was du da machst aber wenn du einen Typepointer übergeben möchtest machst du das wie folgt
BlitzBasic: [AUSKLAPPEN]
und wenn du ihn zurückgeben will kannst du das mit BlitzBasic: [AUSKLAPPEN] Function geb_dir_nen_type.matrix4x4(x) Damit kannst du ja in der Funktion auf die Felder zugreifen, ob du einen Pointer auf ein spezielles Feld machen kannst weiß ich nicht, aber damit müsste man doch alles nötige bauen können? |
||
![]() |
LukasBanana |
![]() Antworten mit Zitat ![]() |
---|---|---|
Wie das in B3D geht weiß ich, aber ich habe ja eine Wrapper Funktion. Also eine Funktion die in C geschrieben ist und in der *.decls steht. Ich vermute mal, dass man da nicht so ohne weiteres auch Strukturen übergeben kann. Jeden falls wüsste ich nicht, wie das in der *.delcs Datei aussehen sollte.
Ich brauche einfach nur die Addresse der Struktur bzw. der Variable (vom Typ einer Struktur) im RAM - also eben einfach den Pointer ^^. Geht das vlt. irgendwie über die "Bank" Funktionen? Ich habe mit denen noch nie etwas gemacht. |
||
Mein YouTube Channel: http://www.youtube.com/user/SoftPixel
Mein Twitter Profil: https://twitter.com/LukasBanana Meine Projekte auf github.com: https://github.com/LukasBanana Meine Projekte auf bitbucket.org: https://bitbucket.org/LukasBanana |
![]() |
Thunder |
![]() Antworten mit Zitat ![]() |
---|---|---|
Wenn du eine Variable des Typs matrix4x4 deklarierst sollte das eine Pointervariable sein und du müsstest sie ohne weiteres an die C-Funktion übergeben können. Also m.matrix4x4 zum Beispiel wäre ein Pointer und mit "New matrix4x4" wird der Speicherbereich auf den der Pointer zeigen soll bereitgestellt.
Aber Achtung! Die BlitzBasic-Types enthalten nicht nur Variablen, die du definiert hast sondern auch Pointer zum vorherigen und zum nächsten Eintrag in der Liste. Am gescheitesten ist es afaik eine Bank zu erstellen, die die Einträge enthält und die dann zu übergeben (ist auch ein Pointer). mfg Thunder |
||
Meine Sachen: https://bitbucket.org/chtisgit https://github.com/chtisgit |
![]() |
LukasBanana |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ok hab's jetzt raus gefunden wie's geht. Und zwar mit CreateBank. Allerdings sind noch 24 Bytes für Informationen über die Bank gespeichert mit denen ich nix anfangen kann. Danach kommt der Speicher den man angelegt hat.
EDIT: Mh, klappt leider doch nicht so wie ich mir das vor gestellt hatte. Ich löse das jetzt mit einem eigenen Buffer. Code: [AUSKLAPPEN] Buffer = CreateBuffer(4) BufferPokeInt(Buffer, 123) FreeBuffer(4) ; etc. |
||
Mein YouTube Channel: http://www.youtube.com/user/SoftPixel
Mein Twitter Profil: https://twitter.com/LukasBanana Meine Projekte auf github.com: https://github.com/LukasBanana Meine Projekte auf bitbucket.org: https://bitbucket.org/LukasBanana |
![]() |
Noobody |
![]() Antworten mit Zitat ![]() |
---|---|---|
Man kann sowohl Types als auch Banks problemlos an DLLs übergeben (wurde übrigens zig dutzend Mal im Forum durchgekaut und steht ausserdem in der userlibs.txt in deinem Userlibs-Ordner ![]() Du musst dafür einfach in der .decls folgendes stehen haben Code: [AUSKLAPPEN] .lib "MeineTolleLib.dll"
Foo( Zeiger* ):"_Foo@4" So kannst du Foo beliebig mit Types oder Banks aufrufen, übergeben wird dann jeweils der Speicherbereich, bei Banks musst du also nicht erst noch die ersten xy Bytes überspringen. |
||
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 |
![]() |
LukasBanana |
![]() Antworten mit Zitat ![]() |
---|---|---|
Cool danke, funktioniert hervoragend ![]() |
||
Mein YouTube Channel: http://www.youtube.com/user/SoftPixel
Mein Twitter Profil: https://twitter.com/LukasBanana Meine Projekte auf github.com: https://github.com/LukasBanana Meine Projekte auf bitbucket.org: https://bitbucket.org/LukasBanana |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group