Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Do Mär 28, 2024 22:46

Foren-Übersicht » Programmierung » Shader
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 6 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Struktur-Funktion in GLSL
BeitragVerfasst: Do Jan 22, 2015 09:46 
Offline
DGL Member

Registriert: Di Dez 16, 2014 10:18
Beiträge: 32
Programmiersprache: C++
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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Struktur-Funktion in GLSL
BeitragVerfasst: Do Jan 22, 2015 13:00 
Offline
DGL Member

Registriert: Do Dez 29, 2011 19:40
Beiträge: 421
Wohnort: Deutschland, Bayern
Programmiersprache: C++, C, D, C# VB.Net
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:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Struktur-Funktion in GLSL
BeitragVerfasst: Do Jan 22, 2015 13:43 
Offline
DGL Member

Registriert: Di Dez 16, 2014 10:18
Beiträge: 32
Programmiersprache: C++
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++"


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Struktur-Funktion in GLSL
BeitragVerfasst: Do Jan 22, 2015 14:16 
Offline
DGL Member

Registriert: Do Dez 29, 2011 19:40
Beiträge: 421
Wohnort: Deutschland, Bayern
Programmiersprache: C++, C, D, C# VB.Net
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)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Struktur-Funktion in GLSL
BeitragVerfasst: Do Jan 22, 2015 14:46 
Offline
DGL Member

Registriert: Di Dez 16, 2014 10:18
Beiträge: 32
Programmiersprache: C++
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!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Struktur-Funktion in GLSL
BeitragVerfasst: So Jan 25, 2015 00:06 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Nov 08, 2010 18:41
Beiträge: 769
Programmiersprache: Gestern
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.  

_________________
Meine Homepage


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 6 Beiträge ] 
Foren-Übersicht » Programmierung » Shader


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 9 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.096s | 17 Queries | GZIP : On ]