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

Aktuelle Zeit: So Jul 20, 2025 18:08

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



Ein neues Thema erstellen Auf das Thema antworten  [ 7 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: glsl Errorcodes
BeitragVerfasst: So Jul 05, 2009 14:46 
Offline
DGL Member
Benutzeravatar

Registriert: Do Okt 16, 2008 13:18
Beiträge: 252
Hi,
ich schreibe im Moment noch an meiner Shader-Klasse, nun habe ich ein Problem entdeckt. ATI-Grafikkarten, erstellen auch einen Infolog um mir mitzuteilen ob die Shader in Hard- oder Software ausgeführt werden, ich interpretiere im Moment jedoch jeden Infologeintrag als Fehler und lasse das Programm beenden. Gibt es eine Möglichkeit eine Liste mit allen Errorcodes zu bekommen und herauszufinden welche keine Fehler sind?

_________________
You even trying ...

Website: http://rise-of-light.de/


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jul 05, 2009 15:00 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Ich mache einfach mal Copy&Paste aus meinem Code. Also GL_COMPILE_STATUS bzw. GL_LINK_STATUS checken.

Code:
  1. GLuint CUtil::loadShader(GLenum type, const char* filename) {
  2.     FILE* file = fopen(filename, "rb");
  3.     if (file == 0) {
  4.         throw Exception(std::string("error loading '") + filename + "'");
  5.     }
  6.  
  7.     fseek(file, 0, SEEK_END);
  8.     int size = ftell(file);
  9.     fseek(file, 0, SEEK_SET);
  10.     char* data = new char[size+1];
  11.     int read = fread(data,1,size,file);
  12.     if (read != size) {
  13.         throw Exception(std::string("error while loading '") + filename + "'");
  14.     }
  15.     fclose(file);
  16.     data[size]=0;
  17.     const char* data_const = data;
  18.  
  19.     GLuint shader = glCreateShader(type);
  20.     glShaderSource(shader, 1, &data_const, NULL);
  21.     glCompileShader(shader);
  22.     delete[] data;
  23.  
  24.     // retrieve infolog
  25.     int len;
  26.     glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &len);
  27.     if (len > 1) {
  28.         char buffer[len];
  29.         glGetShaderInfoLog(shader, len, NULL, buffer);
  30.         std::cout << "file: " << filename << "\n";
  31.         std::cout << buffer << "\n";
  32.     }
  33.    
  34.     int status = 0;
  35.     glGetShaderiv(shader, GL_COMPILE_STATUS, &status);
  36.     if (status) {
  37.         return shader;
  38.     }
  39.     else {
  40.         throw Exception("error: shader compilation failed.");
  41.     }
  42. }
  43.  
  44. void CUtil::checkLinkError(const std::string name, GLuint program) {
  45.     int status = 0;
  46.     glGetProgramiv(program, GL_LINK_STATUS, &status);
  47.     if (!status) {
  48.         // retrieve infolog
  49.         int len;
  50.         glGetProgramiv(program, GL_INFO_LOG_LENGTH, &len);
  51.         if (len > 1) {
  52.             char buffer[len];
  53.             glGetProgramInfoLog(program, len, NULL, buffer);
  54.             std::cout << buffer << "\n";
  55.         }
  56.         throw Exception(name + ": program linking failed.");
  57.     }
  58. }

_________________
Yeah! :mrgreen:


Zuletzt geändert von Coolcat am So Jul 05, 2009 15:02, insgesamt 2-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jul 05, 2009 15:00 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Okt 04, 2006 15:42
Beiträge: 78
Wohnort: Bonn
Programmiersprache: Python, C++, Delphi
Ich würde es anders rum machen - die Nachricht mit Hardware mode ignorieren und falls
er in Software läuft eine Warnung abgeben.

Edit: Oder eben CoolCats Methode mit glGetShaderiv :)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jul 06, 2009 13:14 
Offline
DGL Member
Benutzeravatar

Registriert: Do Okt 16, 2008 13:18
Beiträge: 252
Hi,
könnt ihr mir bitte nochmal erklären wo der Fehler abgefangen wird. Wie ich an die Infos komme weis ich ja, ich weis nur nicht wie oder wo ich die eine Mitteilung abfangen oder erkennen kann, damit mein Programm sich nicht beendet, sondern weiter läuft.

_________________
You even trying ...

Website: http://rise-of-light.de/


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jul 06, 2009 13:33 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Mit GL_COMPILE_STATUS kannst du abfragen ob der vorhergehende Compiliervorgang von "shader" erfolgreich war:
Code:
  1. int status = 0;
  2. glGetShaderiv(shader, GL_COMPILE_STATUS, &status);
  3. if (status) {
  4.      // erfolg
  5. }
  6. else {
  7.      // schiefgegangen
  8. }


Analog kannst du mit GL_LINK_STATUS abfragen ob der vorhergehende Linkvorgang des Programms "program" erfolgreich war:
Code:
  1. int status = 0;
  2. glGetProgramiv(program, GL_LINK_STATUS, &status);
  3. if (status) {
  4.      // erfolg
  5. }
  6. else {
  7.      // schiefgegangen
  8. }

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jul 06, 2009 16:11 
Offline
DGL Member
Benutzeravatar

Registriert: Do Okt 16, 2008 13:18
Beiträge: 252
@Coolcat: Ja, ich weis ja wie ich an die Meldungen komme. Vielleicht habt ihr mich falsch verstanden, auf einem Laptop mit einer ATI-Grafikkarte kommt immer eine Meldung die etwa so ist "Vertexshader läuft im Hardwaremodus. Pixelshader läuft im Hardwaremodus". Mein Programm kann allerdings nicht unterscheiden, ob das jetzt ein Fehler ist, oder ob es eine Infomeldung ist, standartmäßig interpretiert es die Infomeldung als Fehler und beendet sich. Jetzt ist meine Frage wie ich herausfinden kann ob es eine Infomeldung ist, damit mein Programm sich nicht bei einer Meldung beendet bei der es sich eigendlich nicht beenden müsste.

_________________
You even trying ...

Website: http://rise-of-light.de/


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jul 06, 2009 17:04 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jul 20, 2006 17:34
Beiträge: 52
Genau das hat Coolcat doch geschrieben: Der Code speichert in nem Boolean ob der Compile- / Linkvorgang erfolgreich war...

_________________
2+2=5
For extremely large values of two


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


Wer ist online?

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