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

Aktuelle Zeit: Do Mär 28, 2024 20:02

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



Ein neues Thema erstellen Auf das Thema antworten  [ 26 Beiträge ]  Gehe zu Seite Vorherige  1, 2
Autor Nachricht
 Betreff des Beitrags: Re: Textur Nummern;
BeitragVerfasst: Mo Nov 24, 2014 18:11 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1276
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Zitat:
Mit #version 330 eigentlich gar nicht, wie weiter oben im Thread schon erwähnt wurde:

Ich dachte hier ging es um direkte Constanten-Zuweisung.
Ist aber schade, das so eine wichtige Funktion fehlt.
Die Menge an Texturen ist er zur Laufzeit bekannt.
Somit muss ich bei maximal 4-fach Texturing 4 verschiedene Shader laden.

Code:
  1. {
  2.   texture(texMap[0], coords);
  3. }
  4. {
  5.   texture(texMap[1], coords);
  6. }

Bisschen könnte man das noch vereinfachen, in dem man die {} weglässt.

Für was ist sampler2DArray mit dem habe ich auch schon probiert aber es gab nichts schlauen.

PS:Interessanterweise frisst die Shader-Einheit von Intel dies sogar ab #version 130.

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Textur Nummern;
BeitragVerfasst: Mo Nov 24, 2014 18:45 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Aug 14, 2013 21:17
Beiträge: 587
Programmiersprache: C++
mathias hat geschrieben:
Bisschen könnte man das noch vereinfachen, in dem man die {} weglässt.
Ich habe sie mit Absicht hingeschrieben. Stell dir vor, in der for-Schleife würden auch Variablen deklariert. Das Entrollen der Schleife würde dann zu Compile-Fehlern führen, wegen Mehrfachdeklaration.

_________________
So aktivierst du Syntaxhighlighting im Forum: [code=pascal ][/code], [code=cpp ][/code], [code=java ][/code] oder [code=glsl ][/code] (ohne die Leerzeichen)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: sampler2D Arrays
BeitragVerfasst: Di Nov 25, 2014 20:00 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1276
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
In diesem Tutorial wurde es mit einem if gelöst.

http://www.mbsoftworks.sk/index.php?pag ... utorial=14

Das GLSL für sowas so zickig ist, kann ich nicht begreifen. :evil:

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: sampler2D Arrays
BeitragVerfasst: Di Dez 02, 2014 18:20 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1276
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Ich habe es jetzt folgendermassn gelöst, geht bis 4-fach Texturing.
Vielleicht kann man es eleganter lösen, aber immerhin funktioniert es jetzt auch mit NVidia.

Code:
  1. procedure TTexturKoerper.LoadShader(light: boolean);
  2. const
  3.   e = #13#10;
  4.   ia: array[0..3] of integer = (0, 1, 2, 3);
  5.  
  6.   Kopf =
  7.     '#version 330' + e +
  8.     'in vec3 Pos; ' + e +
  9.     'in vec3 Normal;' + e +
  10.     'in vec2 UV;' + e +
  11.  
  12.     'out vec4 OutColor;' + e +
  13.  
  14.     'uniform sampler2D myTextureSampler[4];' + e +
  15.  
  16.     '$light.glsl' + e +
  17.  
  18.     'void main() {' + e;
  19.  
  20.   Fuss =
  21.     '  float cdummy = OutColor.a;' + e +
  22.     '  OutColor = OutColor * (diffuse(LightPosition) + specular(LightPosition));' + e +
  23.     '  OutColor.a = cdummy;' + e +
  24.     '}';
  25. var
  26.   f: string;
  27.   i: integer;
  28.  
  29. {$I textur_vert.inc}
  30.   //{$I textur_frag.inc}
  31.  
  32. begin
  33.   SetLength(ShaderID_textur, 4);
  34.   SetLength(Shader, 4);
  35.  
  36.   f := Kopf +
  37.     '  OutColor = texture( myTextureSampler[0], UV );' + e + Fuss;
  38.   Shader[0] := TShader.Create(Str_textur_vert, f, light);
  39.  
  40.   f := Kopf +
  41.     '  OutColor = (texture( myTextureSampler[0], UV ) + texture( myTextureSampler[1], UV )) / 2;' + e + Fuss;
  42.   Shader[1] := TShader.Create(Str_textur_vert, f, light);
  43.  
  44.   f := Kopf +
  45.     '  OutColor = (texture( myTextureSampler[0], UV ) + texture( myTextureSampler[1], UV ) + texture( myTextureSampler[2], UV )) / 3;' + e + Fuss;
  46.   Shader[2] := TShader.Create(Str_textur_vert, f, light);
  47.  
  48.   f := Kopf +
  49.     '  OutColor = (texture( myTextureSampler[0], UV ) + texture( myTextureSampler[1], UV ) + texture( myTextureSampler[2], UV ) + texture( myTextureSampler[3], UV )) / 4;'
  50.     + e + Fuss;
  51.   Shader[3] := TShader.Create(Str_textur_vert, f, light);  


Draw sieht dann so aus:
Code:
  1. procedure TTexturKoerper.Draw(const ObjectMatrix: TMatrix; TextBuffer: array of TTexturBuffer);
  2. var
  3.   anz, i: integer;
  4. begin
  5.   anz := Length(TextBuffer) - 1;
  6.   if anz > 3 then begin
  7.     LogForm.Add('Zuviel Texturen, anz: ' + IntToStr(anz + 1));
  8.     anz := 3;
  9.   end;
  10.   Shader[anz].UseProgram; // Je nach Anzahl Texturen, wird ein anderer Shader geladen.
  11.  
  12.   if StaticObject then begin
  13.     glUniformMatrix4fv(ShaderID_textur[anz].WorldMatrix_id, 1, False, @ObjectMatrix.Matrix);
  14.   end else begin
  15.     ObjectMatrix.Push;
  16.     ObjectMatrix.Multiply(OpenGL.Camera.WorldMatrix, ObjectMatrix);
  17.     glUniformMatrix4fv(ShaderID_textur[anz].WorldMatrix_id, 1, False, @ObjectMatrix.Matrix);
  18.     ObjectMatrix.Pop;
  19.   end;
  20.  
  21.   for i := 0 to anz do begin
  22.     glActiveTexture(GL_TEXTURE0 + i);
  23.     glBindTexture(GL_TEXTURE_2D, TextBuffer[i].ID);
  24.   end;
  25.   inherited Draw;
  26. end;  

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Textur Nummern;
BeitragVerfasst: Di Dez 23, 2014 19:47 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1276
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
glAwesome hat geschrieben:
Mit #version 330 eigentlich gar nicht, wie weiter oben im Thread schon erwähnt wurde:
Sascha Willems hat geschrieben:
man kann z.B. nicht im Code über das Array iterieren

Auf dieses Problem bin ich auch schon gestoßen. In meinem Beleuchtungsshader sollte jede Lichtquelle einen Shadowsampler bekommen und über die Lichtquellen sollte natürlich mit einer for-Schleife iteriert werden. Als Pseudo-Workaround kompiliere ich den Shader für verschiedene Anzahlen von Lichtquellen und rolle dabei die for-Schleife aus. Also statt
Code:
  1. for(int i=0; i<2; ++i){
  2.   texture(texMap[i], coords);
  3. }
mache ich sowas:
Code:
  1. {
  2.   texture(texMap[0], coords);
  3. }
  4. {
  5.   texture(texMap[1], coords);
  6. }

Wobei der zweite Code selbstverständlich nicht handgetippt, sondern automatisiert erstellt wird. Das ist auch genau der Ansatz, der vom glsl PreCompiler unterstützt wird, wenn ich das richtig verstanden habe.


Funktioniert der Shader dieses Tutorials mit NVidia ?

http://wiki.delphigl.com/index.php/shad ... _Lighting2

Dort wird mit Variablen(i) auf die Array zugegriffen.

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: sampler2D Arrays
BeitragVerfasst: Mi Dez 24, 2014 16:16 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Aug 14, 2013 21:17
Beiträge: 587
Programmiersprache: C++
In dem Shader gibt es kein Array von sampler-Objekten.

_________________
So aktivierst du Syntaxhighlighting im Forum: [code=pascal ][/code], [code=cpp ][/code], [code=java ][/code] oder [code=glsl ][/code] (ohne die Leerzeichen)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: sampler2D Arrays
BeitragVerfasst: Mi Dez 24, 2014 16:44 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1276
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Wen ich es richtig verstehe, machen nur sampler-Variablen Probleme ?

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: sampler2D Arrays
BeitragVerfasst: Mi Dez 24, 2014 20:20 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Nov 08, 2010 18:41
Beiträge: 769
Programmiersprache: Gestern
Nein das betrifft alle opaquen Datentypen (also auch image und counter). Diese darfst du halt nur über Ausdrücke ansprechen welche sich aus Konstanten oder, in neueren Versionen, Uniforms zusammensetzen.

Das Problem ist halt das diese Typen nur Referenzen auf Objekte sind aber nicht die Objekte selbst. Und genau diese referenzierten Objekte müssen aber vorher bekannt sein, denn sonst können keine Referenzen gebildet werden, da z.B. die Größe nicht bekannt ist.

Ist im Prinzip eine ähnliches Problem wie mit Referenzen unter C++ nur halt eleganter "gelöst" :)

_________________
Meine Homepage


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: sampler2D Arrays
BeitragVerfasst: Do Dez 25, 2014 16:28 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1276
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Nur das komische dabei, wieso kann ein billiger Intel-Grafikeinheit dies, aber eine hochwertige NVidia nicht.

Zitat:
Ist im Prinzip eine ähnliches Problem wie mit Referenzen unter C++ nur halt eleganter "gelöst"


Was findest du daran elegant, elegant wäre, wen ma auch über Zähl-Variabeln darauf zugreifen könnnte ?

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: sampler2D Arrays
BeitragVerfasst: Do Dez 25, 2014 19:34 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 27, 2005 12:44
Beiträge: 393
Wohnort: Berlin
Programmiersprache: Java, C++, Groovy
Hallo,

das Iteriereren über das sampler-Array soll angeblich erst ab Version 4.00 möglich sein.

Viele Grüße
dj3hut1

_________________
Wenn Gauß heute lebte, wäre er ein Hacker.
Peter Sarnak, Professor an der Princeton University


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: sampler2D Arrays
BeitragVerfasst: Sa Dez 27, 2014 15:04 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Nov 08, 2010 18:41
Beiträge: 769
Programmiersprache: Gestern
dj3hut1 hat geschrieben:
Hallo,

das Iteriereren über das sampler-Array soll angeblich erst ab Version 4.00 möglich sein.

Viele Grüße
dj3hut1


Genau das meinte ich mit den "konstanten" Ausdrücken. Besser erklärt findet man es hier.

mathias hat geschrieben:
Nur das komische dabei, wieso kann ein billiger Intel-Grafikeinheit dies, aber eine hochwertige NVidia nicht.

Zitat:
Ist im Prinzip eine ähnliches Problem wie mit Referenzen unter C++ nur halt eleganter "gelöst"


Was findest du daran elegant, elegant wäre, wen ma auch über Zähl-Variabeln darauf zugreifen könnnte ?


Sicher man kann argumentieren das dieses System noch unvollständig ist. Und ich denke die Entwicklungen sprechen auch dafür das hier noch eine ganze Menge passieren wird. Das ist aber nicht das eigentlich interessante daran.
Du musst bedenken das Arrays normalerweise darauf beruhen das alle Elemente gleich groß sind. Genau das ist aber zum Beispiel bei einen Sampler nicht immer der Fall. Texturen sich schließlich unterscheiden sehr stark in ihren Aufbau und damit auch beim sampeln.
Normalerweise würde man nun extra Berechnungen zur Compile oder Laufzeit durchführen. Bei Shadern scheint das allerdings beim Binding stattzufinden.

_________________
Meine Homepage


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 26 Beiträge ]  Gehe zu Seite Vorherige  1, 2
Foren-Übersicht » Programmierung » Shader


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 5 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.165s | 17 Queries | GZIP : On ]