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

Aktuelle Zeit: Mi Jul 16, 2025 21:29

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



Ein neues Thema erstellen Auf das Thema antworten  [ 38 Beiträge ]  Gehe zu Seite Vorherige  1, 2, 3  Nächste
Autor Nachricht
 Betreff des Beitrags: Re: Performance von GL_LINES
BeitragVerfasst: Mi Feb 02, 2011 20:43 
Offline
DGL Member

Registriert: Do Apr 22, 2010 17:17
Beiträge: 543
Na ich render meine shadowmaps in ein zweites FBO welches bisschen kleiner ist.. Also wechsel ich auch bei jeder lampe einmal in das Schatten FBO und wieder zurück. Also bei 100Lampen dann auch 100 wechsel.. Könnte das ggf. auch mal in anderer Reihenfolge probieren.. Quasi zuerst alle nötigen Schattenänderungen rendern und dann die Projektionen.. Ich guck morgen mal was das ausmacht..
Will auch mal gucken ob das was ausmacht wenn ich die Lichtkegel (Linien) in ein weiteres FBO Rendere, welches bissl kleiner ist.. Wollte nur nicht soviele FBOs verwenden, da ich nicht weiß wieviel durchschnittlich von Grafikkarten unterstützt werden..

Kurz noch ein anderes Problem:
Ich hab von einigen BETA Testern die Info bekommen, das mein Programma nicht wirlich mit ATI karten läuft.. Da kommen wohl nur AVs von OpenGL... Worauf muss ich da im Shader achten??


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Performance von GL_LINES
BeitragVerfasst: Mi Feb 02, 2011 20:52 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Bei ATI muss man sich sehr genau an die Spezifikationen halten (in GLSL) Also alles, was bei nvidia noch als Warning durchgeht bringt dir bei ATI einen Fehler. Also schau mal, ob deine Shader sauber geschrieben sind.

greetings

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Performance von GL_LINES
BeitragVerfasst: Mi Feb 02, 2011 20:56 
Offline
DGL Member

Registriert: Do Apr 22, 2010 17:17
Beiträge: 543
nun mein Compiler gibt mir keine Warnmeldung aus. Wo kann ich da gucken ob irgendwas nicht konform ist?
hier mal mein Fragment Shader für Schatten und Projektion..

Code:
#version 120
const int max_lights = 4;

uniform sampler2D projMap0;
uniform sampler2D projMap1;
uniform sampler2D projMap2;
uniform sampler2D projMap3;

uniform sampler2D shadowMaps0;
uniform sampler2D shadowMaps1;
uniform sampler2D shadowMaps2;
uniform sampler2D shadowMaps3;
uniform sampler2D Texture0;

uniform vec4 LampColors[max_lights];       //Lichtfarbe und intensität
uniform int GlobalLight;                //gibt an ob globales Punktlicht verwendet werden soll
uniform vec4 LightPos[max_lights];          //Lampenpositionen für evtl. weitere Berechnungen
uniform vec4 ShadowActive;                //Gibt an ob Schatten für Lampe 1-4 Aktiv
uniform float GlobalLightFactor;           //Gibt an wie stark alle Lichter sind
 


//MAX 32 FLOATS!!      
varying vec3 anormal;
varying vec4 posEye;
varying vec3 globalLightVec;
varying vec4 projCoord[max_lights];
 
 
void main (void)
{
 vec4  ProjMapColor[max_lights];
 vec4  backgroundColor, projColor;
 vec4  global_color;
 vec3  lightDir, L; 
 float d, att, lambertTerm;
 vec3 normal = normalize(anormal);

 //Hintergrund Farbe
  if (gl_FrontMaterial.ambient.a > 0.0) {
  //keine Textur
     backgroundColor = gl_FrontMaterial.ambient;
   }   else
      backgroundColor = texture2D(Texture0, gl_TexCoord[0].xy);


 //Globales Punktlicht
  if (GlobalLight>0) {
     
     vec3 Reflected = normalize(reflect( -globalLightVec, normal)); 
     vec3 Eye = normalize(-posEye.xyz);      
    vec4 IAmbient  = gl_LightSource[0].ambient * gl_FrontMaterial.ambient;
    vec4 IDiffuse  =   gl_LightSource[0].diffuse * max(dot(normal, globalLightVec), 0.0) * gl_FrontMaterial.diffuse;
    vec4 ISpecular = gl_LightSource[0].specular * pow(max(dot(Reflected, Eye), 0.0), gl_FrontMaterial.shininess) * gl_FrontMaterial.specular;
    global_color = vec4((gl_FrontLightModelProduct.sceneColor + IAmbient + IDiffuse) * backgroundColor + ISpecular);
    }

 vec4 final_color;
 
 
 
 //GoboTexturen abrufen
 ProjMapColor[0] = texture2DProj(projMap0, projCoord[0]);
 ProjMapColor[1] = texture2DProj(projMap1, projCoord[1]);
 ProjMapColor[2] = texture2DProj(projMap2, projCoord[2]);
 ProjMapColor[3] = texture2DProj(projMap3, projCoord[3]);

   vec4  shadowCoordWdiv[max_lights];
   float distanceFromLight[max_lights];
   if (any(greaterThan(ShadowActive, vec4(0.0, 0.0, 0.0, 0.0))))    {
   
   //Schatten
     for (int i=0; i < max_lights; ++i) 
         if(projCoord[i].q < 0.0) {   
    
       vec4 SK = projCoord[i]; 
          SK = (SK+1) * 0.5;         
         SK.z += 2;      
         shadowCoordWdiv[i] =  (SK / SK.w);      
         shadowCoordWdiv[i].z += 0.0005;            
       }
      
     distanceFromLight[0] = texture2D(shadowMaps0, shadowCoordWdiv[0].st).z;   
     distanceFromLight[1] = texture2D(shadowMaps1, shadowCoordWdiv[1].st).z;
     distanceFromLight[2] = texture2D(shadowMaps2, shadowCoordWdiv[2].st).z;
     distanceFromLight[3] = texture2D(shadowMaps3, shadowCoordWdiv[3].st).z;
 
 }
 
 
 float shadow = 1.0;
 //Projektion für jede Lampe 
  for (int i=0; i < max_lights; ++i) 
   if(projCoord[i].q < 0.0) {
     {
      lightDir = vec3(LightPos[i].xyz - posEye.xyz);   
               
      L = normalize(lightDir);
      lambertTerm = dot(normal, L);
       if (lambertTerm>0) {
      
         shadow = 1.0;
      if (ShadowActive[i]>0)
        shadow = distanceFromLight[i] < shadowCoordWdiv[i].z ? 0 : 1.0;
   
      
      if (shadow==1)    
        {      
         d = length(lightDir);
         att = 1.0 / ( gl_LightSource[1].constantAttenuation +
         (gl_LightSource[1].linearAttenuation*d) +
         ((gl_LightSource[1].quadraticAttenuation/2)*d*d));       
 
               
         projColor = LampColors[i] * lambertTerm * att * LampColors[i].a;          
         final_color += ProjMapColor[i] * projColor   * GlobalLightFactor ; 
        }
      }
    }
     } 
   gl_FragColor = (final_color * backgroundColor) + global_color;
}


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Performance von GL_LINES
BeitragVerfasst: Do Feb 03, 2011 09:15 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Das ist aber eigentlich eine ganz andere Frage.

Ich kenne mich mit shadern jetzt nicht so aus. Entsprechend weiß ich nicht wie die Treiber reagieren, wenn man zum Beispiel auf etwas zugreift was es eigentlich gar nicht gibt. Also wenn du von max_lights 4 ausgehst aber nur 3 Werte von außen rein reichst. Also als fiktives Beispiel.

Zugriffsverletzungen passieren auch recht gerne, wenn man zum Beispiel Erweiterungen benutzt die nicht überall vorhanden sind. Also herstellerspezifische Erweiterungen. Entsprechend solltest du bei allen von dir benutzten Erweiterungen überprüfen ob sie auch vorhanden sind. Wenn sie nicht zwingend notwendig sind klemmst du die Codestellen ab ansonsten muss sich dein Programm weigern. Logdateien die von deiner Anwendung erzeugt werden sind da meist recht hilfreich.

Auch gern genommen sind falsch angesprochene VBOs. Ich würde als nicht nur auf Shader achten. Es sei denn du konntest es schon genau darauf eingrenzen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Performance von GL_LINES
BeitragVerfasst: Fr Feb 04, 2011 09:28 
Offline
DGL Member

Registriert: Do Apr 22, 2010 17:17
Beiträge: 543
hab hier n tolles Tool gefunden um seinen Shader für ATI Karten zu testen: http://developer.amd.com/gpu/shader/pages/default.aspx


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Performance von GL_LINES
BeitragVerfasst: Fr Feb 04, 2011 09:46 
Offline
DGL Member

Registriert: Do Apr 22, 2010 17:17
Beiträge: 543
und der meckert hier: shadow = distanceFromLight[i] < shadowCoordWdiv[i].z ? 0 : 1.0;

ERROR: 0:106: error(#162) Wrong operand types no operation ':' exists that takes a left-hand operand of type 'const int' and a right operand of type 'const float' (or there is no acceptable conversion)
ERROR: error(#273) 1 compilation errors. No code generated


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Performance von GL_LINES
BeitragVerfasst: Fr Feb 04, 2011 10:35 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
probiers mal so :
Code:
shadow = distanceFromLight[i] < shadowCoordWdiv[i].z ? 0.0 : 1.0;


NVidia ist hier etwas "lässig" und konvertiert Datentypen auch mal automatisch, aber laut Specs (an die sich ATI 1:1 hält) darf man dass nicht, daher beschwert er sich auch darüber dass du nach dem ? einen Integer (die 0) mit nem Float (1.0) vergleichst. Also mal statt 0 einfach 0.0 nehmen.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Performance von GL_LINES
BeitragVerfasst: Fr Feb 04, 2011 12:49 
Offline
DGL Member

Registriert: Do Apr 22, 2010 17:17
Beiträge: 543
Genau mercie. Ich hab jetzt denk ich alle Fehler behoben. Also die compiler meckern nicht mehr.. Auch wirds korrekt dargestellt. Nur die Performance ist extreeeeeem schlecht.. Auch 2 gleichwärtigen Systemen total unterschiedlich.. Nvidia ~50FPS und ATI ~3FPS

irgendwas stimmt da nich...
Allerdings liegt es hier nicht an den Linien..


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Performance von GL_LINES
BeitragVerfasst: Fr Feb 04, 2011 12:51 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Prüf mal den Shadercompileroutput. 3fps hört sich an als würde dein Shader auf ATI in Software laufen, was dann i.d.R. auch im Log angemerkt wird. Welche ATI ist es denn? Dein Shader ist ja schon relativ groß, da kanns dann halt passieren dass du irgendwelche Limits überschreitet und der Shader via Software ausgeführt wird.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Performance von GL_LINES
BeitragVerfasst: Fr Feb 04, 2011 12:58 
Offline
DGL Member

Registriert: Do Apr 22, 2010 17:17
Beiträge: 543
nun im Compileroutput sieht alles ok aus. Steht überall "wird in Hardware ausgeführt..".. und die Limits müssten auch stimmen.. Ist eine ATI Readon HD5650


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Performance von GL_LINES
BeitragVerfasst: Fr Feb 04, 2011 13:07 
Offline
DGL Member

Registriert: Do Apr 22, 2010 17:17
Beiträge: 543
und ich hab eine GTX465.. wo die gleiche animation mit ~40-50fps läuft.. Ist zwar Desktop aber so groß darf der Unterschied nicht sein...


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Performance von GL_LINES
BeitragVerfasst: Fr Feb 04, 2011 13:23 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Naja, dein riesiger "Übershader" ist auch das Worst-Case Szenario für eine Grafikkarte, egal welche. Du hast viele Schleifen, If-Then-Zweige, Texturenzugriffe, greifst auf diverse Texturensampler zurück und benutzt jede Menge Variablen. Und es reicht ja wenn du nur eine einzige Limitierung der Grafikkarte überschreitest und schon wirds extrem langsam.

Eine GPU ist nunmal eine spezialisierte PU (auch wenn sie inzwischen vieles kann) und keine general Purpose PU wie es bei der CPU der Fall ist. AVon daher muss man halt immernoch bestimmte Limitierungen einhalten und Shader so gut wie möglich optimieren. Zwischen NV und ATI gibts nunmal große Unterschiede und nur weil die Karten sich von der Rohleistung her ähneln bedeutet dass nicht dass der gleiche Shader auf beiden gleichgut laufen muss. Zumal bei NV ja noch ein Zwischencompiler mit dabei ist, der dann evtl. nochmal mehr optimiert.

Bleibt dir also nichts anderes übrig als auf der AIT nach dem Flaschenhals im Shader zu suchen. Also mit dem minimal benötigten anfang und dann immer mehr zuschalten bis du raushast wo es hängt, und dann musst du entsprechend optimieren. Dass ist ja die Kunst beim Shaderschreiben. Große Shader die alles mögliche machen zu schreiben ist ja inzwischen ganz einfach, aber diese so zu gestalten dass sie die Hardware optimal nutzen ist hier die Kunst.

Edit : Schau dir evtl. mal den Shaderanalyser von AMD an, der hilft evtl. bei den ATI-Problemen.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Performance von GL_LINES
BeitragVerfasst: Fr Feb 04, 2011 13:29 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Die beiden Grafikkarten sind überhaupt nicht gleichwertig. Laut Wikipedia hat die GeForce GTX 465 z.B. eine Speicherbandbreite von 102.6 GB/s. Dagegen hat die Mobility Radeon HD 5650 nur 25.6 GB/s! Bei anderen Daten, z.B. Füllrate oder TMUs, sieht das ähnlich aus. Schau es dir an.

Dafür verbraucht die GeForce aber auch 10 mal (!) so viel Strom, zumindest laut TDP-Angabe ;)

http://en.wikipedia.org/wiki/GeForce_40 ... 400_Series
http://en.wikipedia.org/wiki/Comparison ... xxx_Series

_________________
Yeah! :mrgreen:


Zuletzt geändert von Coolcat am Fr Feb 04, 2011 13:38, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Performance von GL_LINES
BeitragVerfasst: Fr Feb 04, 2011 13:35 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
So, hab grad mal deinen Shader durch den GPU Shader Analyzer laufen lassen, und da sieht man was für ein Monster dass Ding ist. Hab grad mal die Statistiken mit meinem Shader für die Erdoberfläche (Übergang Tag/Nacht, Normalmapping, Per-Pixel-Beleuchtung, Overlays, Wolken, 4 TMUs, etc.) verglichen, und dein Shader brauch je nach Hardware 10~20 mal soviele Zyklen wie meiner.

Avg 2.72 Zyklen bei meinem Shader auf ner HD5670, bei deinem Shader sinds dort 19.82 Zyklen, bei kleineren Karten wird die Differenz noch viel größer. Ums Optimieren wirst du also nich herumkommen.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Performance von GL_LINES
BeitragVerfasst: Fr Feb 04, 2011 14:14 
Offline
DGL Member

Registriert: Do Apr 22, 2010 17:17
Beiträge: 543
nun zyklen nehme ich an können aufgedröselte Ifs und schleifen sein? Also ich hab manche ifs eingebaut, weil sie das eine oder andere Frame auf meiner Geforce gebracht haben...


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 4 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:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.009s | 14 Queries | GZIP : On ]