DGL
https://delphigl.com/forum/

Struktur-Funktion in GLSL
https://delphigl.com/forum/viewtopic.php?f=20&t=11329
Seite 1 von 1

Autor:  beecksche [ Do Jan 22, 2015 09:46 ]
Betreff des Beitrags:  Struktur-Funktion in GLSL

Hallihallo,

Ich wollte kurz wissen, ob ich in einer Struktur in GLSL auch eine Funktion/Operatoren einbauen kann. In C++ kann ich mit folgendem Code die Funktionen/Operatoren Problemlos ausführen.

GLSL struct:

Code:
  1.  struct complex {
  2.     float re;
  3.     float im;
  4.  
  5.     float norm() {
  6.         return sqrt(pow(re, 2) + pow(im, 2));
  7.     }
  8.  
  9.     complex operator + (const complex &_value) {
  10.         complex origin = *this;
  11.         origin.im += _value.im;
  12.         origin.re += _value.re;
  13.         return origin;
  14.     }
  15.  
  16.     complex operator - (const complex &_value) {
  17.         complex origin = *this;
  18.         origin.im -= _value.im;
  19.         origin.re -= _value.re;
  20.         return origin;
  21.     }
  22. }; 


GLSL function:

Code:
  1. float fourier(vec4 nodes, float angle) {
  2.     complex IFFT[4];
  3.  
  4.     IFFT[0].re = (nodes.x + nodes.y + nodes.z + nodes.w) / 4.0;
  5.     IFFT[0].im = 0.0;
  6.  
  7.     IFFT[1].re = (nodes.x - nodes.z) / 4.0;
  8.     IFFT[1].im = (-nodes.y + nodes.w) / 4.0;
  9.  
  10.     IFFT[2].re = (nodes.x - nodes.y + nodes.z - nodes.w) / 4.0;
  11.     IFFT[2].im = 0.0;
  12.  
  13.     IFFT[3].re = (nodes.x - nodes.z) / 4.0;
  14.     IFFT[3].im = (nodes.y - nodes.w) / 4.0;
  15.  
  16.     float a = (IFFT[1] + IFFT[3]).norm();
  17.     float b = (IFFT[1] - IFFT[3]).norm();
  18.     float c = IFFT[2].norm();
  19.     float d = IFFT[0].norm();
  20.  
  21.     return a * cos(angle) + b * sin(angle) + c * cos(2 * angle) + d;
  22. }


In GLSL bekomme ich einen Syntaxfehler: '('

Liegt das nun an der Struktur? Oder habe ich etwas übersehen?

Dankesehr

Autor:  OpenglerF [ Do Jan 22, 2015 13:00 ]
Betreff des Beitrags:  Re: Struktur-Funktion in GLSL

Nein, das funktioniert nicht.

Nebenbei:
http://de.wikipedia.org/wiki/OpenGL_Shading_Language#Sprachmerkmale hat geschrieben:
GLSL ist eine C-ähnliche Programmiersprache

Von C++ steht da nichts... :wink:

Autor:  beecksche [ Do Jan 22, 2015 13:43 ]
Betreff des Beitrags:  Re: Struktur-Funktion in GLSL

Habe ich mir bereits gedacht, ich habe die Addition/Subtraktion, sowie den Betrag als separate Funktion eingebaut.

Zu deinem Zitat, füge ich folgendes hinzu: structs in GLSL

Zitat:
"Structs are defined much like C++"

Autor:  OpenglerF [ Do Jan 22, 2015 14:16 ]
Betreff des Beitrags:  Re: Struktur-Funktion in GLSL

Das bezieht sich aber vermutlich nur darauf, dass es in C notwendig war, Strukturtypen bei der Verwendung das Schlüsselwort "struct" voranzustellen oder ein "typedef" vor die Struktur zu machen und den Namen nach hinten zu stellen.
C++ ist sonst in GLSL eher weniger vertreten.

Code:
  1.  
  2. //In C war entweder das...
  3. struct MyStruct
  4. {
  5.    //...
  6. };
  7. void DoSomething(struct MyStruct* StructObj)
  8.  
  9. //... oder das notwendig ...
  10.  
  11. typedef struct
  12. {
  13.    //...
  14. } MyStruct;
  15. void DoSomething(MyStruct* StructObj)

Autor:  beecksche [ Do Jan 22, 2015 14:46 ]
Betreff des Beitrags:  Re: Struktur-Funktion in GLSL

Ja, es ist leider nicht ganz eindeutig beschrieben. Ich habe mal gedacht und gehofft, dass C++ in der GLSL struct "vertreten" sei.

Aber wie gezeigt: möööp - danke fürs mitspielen!

Autor:  yunharla [ So Jan 25, 2015 00:06 ]
Betreff des Beitrags:  Re: Struktur-Funktion in GLSL

Nun ich denke eher das es sich auf das folgende Problem bezieht:
OpenglerF hat geschrieben:
Das bezieht sich aber vermutlich nur darauf, dass es in C notwendig war, Strukturtypen bei der Verwendung das Schlüsselwort "struct" voranzustellen oder ein "typedef" vor die Struktur zu machen und den Namen nach hinten zu stellen.
C++ ist sonst in GLSL eher weniger vertreten.

Code:
  1.  
  2. //In C war entweder das...
  3. struct MyStruct
  4. {
  5.    //...
  6. };
  7. void DoSomething(struct MyStruct* StructObj)
  8.  
  9. //... oder das notwendig ...
  10.  
  11. typedef struct
  12. {
  13.    //...
  14. } MyStruct;
  15. void DoSomething(MyStruct* StructObj)


In C sind das zwei unterschiedliche Dinge. Im ersten Fall definierst du den Namen (Tag) "MyStruct" für den struct-Typen und im zweiten Fall definierst du einen Alias für einen anonymen struct-Typen. Richtig deutlich wird das erst wenn du zum Beispiel folgendes machst:

Code:
  1.  
  2. struct MyStruct_t {
  3.     int hallo[4];
  4. };
  5.  
  6. typedef struct MyStruct {
  7.     int hallo;
  8. } MyStruct_t;
  9.  
  10. int main(int argc, char** argv) {
  11.  
  12.     printf("%Iu\n%Iu\n", sizeof(struct MyStruct_t), sizeof(MyStruct_t));
  13.     return (EXIT_SUCCESS);
  14. }
  15.  
  16.  

Die Ausgabe ist dann zum Beispiel:
Code:
  1.  
  2. 16
  3. 4
  4.  


Das gilt für union, struct und enum (wobei enum ein Sonderfall ist). Interessanterweise behandeln auch heute noch die Compiler das Ganze auf unterschiedliche Weise. Richtig verrückt wird es dann bei solchen Code:

Code:
  1.  
  2. struct x {
  3.     union x * y; //kann je nach Compiler eine struct , neuer Typ oder Fehler sein
  4. };
  5.  

Seite 1 von 1 Alle Zeiten sind UTC + 1 Stunde
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/