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

Aktuelle Zeit: Do Mär 28, 2024 18:28

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



Ein neues Thema erstellen Auf das Thema antworten  [ 12 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Mi Dez 20, 2017 09:34 
Offline
DGL Member

Registriert: Mo Jul 25, 2011 18:15
Beiträge: 25
Wohnort: Nürnberg
Programmiersprache: C#
Hallo zusammen,

bei meinem aktuellen Programm nutze ich den Geometry-Shader zur Berechnung des Volumenschatten.

Leider wird der Geometry-Shader vor allem bei Laptops (aktuell Intel HD Chipsatz) nicht immer angezeigt.
Die OpenGl Version (4.0.0) und die Shading Version (4.0.0) sollten es eigentlich hergeben.
Eigenartig ist, dass weder beim kompilieren der shader, beim linken noch beim validieren (glValidateProgram)
ein Info-Log eingetragen wird?! :? :shock: :roll:

Auf einigen Seiten habe ich gelesen, dass zwecks Stromsparen die Shader deaktiviert werden.
Kann / muss man hierzu weitere OpenGl Register aktivieren?

Weiß vielleicht jemand wie man das am besten analysieren kann oder weiß wo man am besten nachschlägt?
Leider lande ich immer auf Seiten welche den Shader an sich erklären :(

Danke im vorraus für eure Infos

Christian


Zuletzt geändert von chrisfn am Do Dez 21, 2017 13:57, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Dez 20, 2017 17:37 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1276
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Zitat:
Leider wird der Geometry-Shader vor allem bei Laptops (aktuell Intel HD Chipsatz) nicht immer angezeigt.

Woran sieht du, das der Geometrie-Shader nicht funktioniert ?
Ist die Darstellung fehlerhaft, oder kommt gar nichts ?

Geo-Shader stehen schon ab OpenGL 3.3 zur Verfügung.

Zitat:
Auf einigen Seiten habe ich gelesen, dass zwecks Stromsparen die Shader deaktiviert werden.
Das wäre komisch.
Was passiert, wen du den Laptop ans Netzteil hängst ?

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Dez 21, 2017 11:00 
Offline
DGL Member

Registriert: Mo Jul 25, 2011 18:15
Beiträge: 25
Wohnort: Nürnberg
Programmiersprache: C#
Hallo Mathias,

danke für deine Antwort.

Das der GS nicht läuft erkenne ich daran, dass das Schattenvolumen nicht gezeichnet wird.
Zum debuggen hab ich im FS dem Volumen eine Farbe zugewiesen, allerdings wurde nichts gezeichnet :(

Der Effekt ist mit oder ohne Netzteil derselbe. Leider mach das keinen Unterschied.

Glaub ich wende mich mal an den Intel-Support direkt. Allein das Thema, wann welche Shader deaktiviert werden müsste doch irgendow definiert sein :roll:

Gruß
Christian


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Dez 21, 2017 12:08 
Offline
DGL Member

Registriert: Fr Mai 11, 2012 13:25
Beiträge: 229
Programmiersprache: c++, c, JavaScript
Ich würde mal schauen, ob der Shader auch ohne Warnings auf der Hardware kompiliert wird, und dann ob Du etwas siehts, wenn Du im Fragmentshader, der an dem Geometryshader hängt was produzieren kannst mit einer simplen ausgaben wie vec4(1.).

Es kann aber an vielen andere Dingen liegen, z.B. das der Vertex irgendwo auf dem Weg 0 wird.
glGeterror hast Du schon gemacht? nach dem ausführen des Geometryshaderzeugs?

_________________
"Pixel, ich bin dein Vater."
-Darf Shader


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Dez 21, 2017 13:49 
Offline
DGL Member

Registriert: Mo Jul 25, 2011 18:15
Beiträge: 25
Wohnort: Nürnberg
Programmiersprache: C#
Hallo Vinz,

beim kompilieren wie auch beim Ausführen wird kein Fehler eingetragen (weder als Fehler 'glGetError' wie auch im InfoLog).
Ich habe eben mit der ShaderVersion herumgespielt.
Wenn ich die Version auf 3.0 bzw. 3.2 (#130 bzw. #150) lege wird der Shader zwar ausgeführt aber nicht richtig.
Wahrscheinlich kommt der Treiber mit den BuildIn-Variablen nicht 100%ig zurecht.

Aber eigenartig ist der Unterschied zwischen PC (AMG) und Laptop (Intel HD).
Sobald ich mehr weiß, werde ich dies hier noch mal dranhängen.

Danke für eure Antworten
Christian

Den Shader habe ich als Anlage hinzugepackt ... falls es jemand interessiert

Dateianhang:
Dateikommentar: Shader für Schattenvolumenberechnung
ShadowVolumeShader.txt [5.03 KiB]
419-mal heruntergeladen


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Dez 21, 2017 15:23 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Aug 14, 2013 21:17
Beiträge: 587
Programmiersprache: C++
Hallo chrisfn, anbei ein paar Anmerkungen zu deinem Problem und dem, was weiter oben geschrieben wurde:
  • Dass Geometry-Shader auf der selben GPU plötzlich nicht mehr funktionieren wegen Akkubetrieb, ist Humbug. So etwas gibt es nicht.
  • Geometry-Shader gehen ab OpenGL 3.2 bzw. mit entsprechender Extension auch schon vorher. Du verwendest die Extension EXT_geometry_shader4. Gibt es einen Grund, warum du nicht die in OpenGL 3.2 bereits enthaltenen Geometry-Shader nimmst? Letztere erfahren nämlich bessere Treiberunterstützung.
  • Wenn sich dein Programm je nach OpenGL-Version unterschiedlich verhält, wäre es interessant zu wissen, wie du deinen Kontext erstellst.
  • Bekommst du eine Meldung im Info-Log, wenn du absichtlich einen Fehler im Shader einbaust? Wenn nicht, überprüfe/zeige uns deinen Code zum Abfragen des Logs.
  • Solltest du Fehler oder Warnungen bekommen, wäre es sehr hilfreich, wenn du nicht den ganzen Shadercode in eine Zeile schreiben würdest. So kannst du den Fehler nämlich nicht einer bestimmten Zeile zuordnen. Am besten ist es, wenn du die Shader ordentlich formatiert in eine Textdatei schreibst und diese im Programm lädst.

_________________
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  
BeitragVerfasst: Do Dez 21, 2017 17:24 
Offline
DGL Member

Registriert: Mo Jul 25, 2011 18:15
Beiträge: 25
Wohnort: Nürnberg
Programmiersprache: C#
Hallo glAwesome,

danke für deine Antwort. Vor allem das mit dem Hinweis auf die 'extension' bringt mich zum grübeln.

Ich kenne hierzu keine Unterschiede?! Um den GS zu aktivieren benötige ich doch den Eintrag.
Andere Versionen habe ich hierzu www.khronos.org/../GS_Examples und der verlinkten Spec.
nicht gefunden.
Alternativ finde ich unter Wiki Extensions nur die Extension 'GL NV geometry shader4'.
Meister Google sagt das er genausowenig dazu weiß wie ich :)

Im Header verwende ich folgenden Eintrag:
Code:
  1. #version 130\n
  2. #extension GL_EXT_geometry_shader4 : enable\n


Bzgl. deinen Anmerkungen:
- In welchem Kontext: Meinst du wie ich die OpenGl-Register initialisiere?
Zwischen den OpenGl-Versionen ist vor allem die Verwendung der BuildIn-Variablen (gl_PositionIn, gl_NormalMatrix, gl_ModelViewProjectionMatrix,..) zu sehen.
Entweder beim kompilieren werden diese akzeptiert (kompilieren erfolgreich) oder eben nicht (error log beim komilieren).
Interessant ist hierbei, dass selbst bei der Version 3.3 die BuildIn-Matrizen nicht mehr akzeptiert werden :/

- Error bzw. Info Logs
Ich frage eigentlich immer alles ab um zu prüfen ob der Shader kompiliert wurde.
(CompileStatus -> glGetShaderiv, InfoLog -> glGetShaderInfoLog, LinkStatus -> glGetProgramiv und selbstverständlich den GlGetError)
Fehler zeigt er eig nur an, wenn code Fehler oder Probleme mit den BuildIn-Variablen bestehen.

- Alles in einer Zeile
Aktuell habe ich mit den üblichen Zeilenumbrüchen probleme beim kompilieren. Da ich mit C# programmiere könnte es viell. am C# string-Format liegen (16 Bit pro Zeichen).
Da der InfoLog aber immer recht genau ist hat mich das bisher nicht wirklich gestört :oops:

So wie es aussieht, muss ich mich mal mit den extensions und Versionen befassen. Dann könnte ich auch mal einen Shader-Beitrag veröffentlichen mit diesen Stolperfallen :)

Gruß
Christian


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Dez 21, 2017 17:50 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1276
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Zitat:
- Alles in einer Zeile
Aktuell habe ich mit den üblichen Zeilenumbrüchen probleme beim kompilieren. Da ich mit C# programmiere könnte es viell. am C# string-Format liegen (16 Bit pro Zeichen).

Hinter #version und #extension hast du ein \n dies frisst er anscheinend .
Somit sollte es beim restlichen Code auch gehen.

Wen du in der Einleitung liest, verhalten sich Grafikkarten recht unterschiedlich.
https://wiki.delphigl.com/index.php/Laz ... aten_laden

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Dez 21, 2017 18:20 
Offline
DGL Member

Registriert: Mo Jul 25, 2011 18:15
Beiträge: 25
Wohnort: Nürnberg
Programmiersprache: C#
Hallo mathias,

waow... danke für den Hinweis auf das ausgiebige OpenGl 3.3 Tutorial.
Das werde ich die nächsten Tage mal durchgehen.

Ein Punkt hat mich jedoch sehr gewundert:
Code:
  1. procedure TForm1.FormCreate(Sender: TObject);
  2. begin
  3.   ogc := TOpenGLControl.Create(Self); // Den Zeichen-Context erzeugen.
  4.   with ogc do begin
  5.     Parent := Self;
  6.     Align := alClient;
  7.     OpenGLMajorVersion := 3;          // Dies ist wichtig, dass der Context 3.3 verwendet wird.
  8.     OpenGLMinorVersion := 3;
  9.     OnPaint := @DrawScene;
  10.     InitOpenGL;
  11.     MakeCurrent;
  12.     ReadExtensions;
  13.     ReadImplementationProperties;
  14.   end;
  15.   InitScene;                          // Rendert die Szene
  16. end;


Ich war immer der Meinung, dass der installierte Treiber die OpenGl-Version bestimmt (außer speziellen Kommandos oder anderen Definitionen).
Das man diesen beim erzeugen des Kontextes beeinflussen kann war mir bisher nicht bewusst.
Da muss ich mal in den SourceCode von Tao schauen.

Nochmals 1000-Dank für die Hinweise

Christian


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Dez 21, 2017 18:30 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1276
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Zitat:
waow... danke für den Hinweis auf das ausgiebige OpenGl 3.3 Tutorial.
Das Tutorial ist noch in arbeit, aus diesem Grund gibt es auch noch keinen Link im Wiki. aber ich arbeite gegenwärtig daran.

Zitat:
Ich war immer der Meinung, dass der installierte Treiber die OpenGl-Version bestimmt (außer speziellen Kommandos oder anderen Definitionen).

Da gibt es leider rechte Unterschiede.

Mit meinem Intel Onboard 4000 konnte ich die Version unter Windows bei 0.0 belassen. Unter Linux musste zwingend 3.3 rein.
Bei NVidia hat es auch mit Linux mit 0.0 funktioniert.

Eines muss ich leider gestehen, das die Context-Erzeugung im Tutorial leider (noch) nicht perfekt ist.

Übrigens hat es im Tutorial ein Beispiel für einen Geometrieshader.

Die Sourcen sind (noch) hier: http://mathias1000.bplaced.net/Tutorial ... source.zip

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Dez 22, 2017 07:56 
Offline
DGL Member

Registriert: Mo Jul 25, 2011 18:15
Beiträge: 25
Wohnort: Nürnberg
Programmiersprache: C#
Werd den shader nun überarbeiten und für die Version 3.3 ready machen.
Wollte hald nicht für jedes Objekt eine Transformationsmatrix per glUniform laden.

Werd versuchen alles im Speicher abzulegen. Die beste Lösung wäre anstatt glTranslate / glRotate gleich das VertexArray im Speicher zu verändern ... dann bräuchte auch die gl_ModelViewMatrix nimmer.

Würde das Ergebnis in die Shadersammlung aufnehmen. Denke bin nicht der einzige der darüber stolpert ... und würde gerne mal was zurückgeben :)


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Dez 22, 2017 18:46 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1276
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Zitat:
Werd versuchen alles im Speicher abzulegen. Die beste Lösung wäre anstatt glTranslate / glRotate gleich das VertexArray im Speicher zu verändern .
Das ist eigentlich nicht der Sinn von OpenGL, das man die Vertex-Daten modifizieren muss. Für dies sind Matrizen da.
Was mir noch auffällt, glTranslate/glRotate sind altes OpenGL und werden mit OpenGL 3.3 nicht mehr unterstützt.

Schau mal bei Matrizen und 3D nach, wie dies mit dem moderen OpenGL geht.
https://wiki.delphigl.com/index.php/Laz ... 3_Tutorial

_________________
OpenGL


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


Wer ist online?

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