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

Aktuelle Zeit: Fr Jul 18, 2025 08:11

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



Ein neues Thema erstellen Auf das Thema antworten  [ 7 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Mi Okt 06, 2010 12:21 
Offline
DGL Member

Registriert: Do Apr 22, 2010 17:17
Beiträge: 543
Moin,

also ich hab es jetzt hinbekommen meine Texturprojektion für mehrere Projektoren anzuwenden. Sieht auch wunderschön aus. Doch mehr ab 20 Lampen gehts mit den fps in den keller. Vor allem wenn ich nah ander Geometrie bin mit meiner Kamera.. Hier mal der Shader vielleicht fällt jemanden was zur optimierung auf:

Vertex:
Code:
#version 120
const int max_lights = 10;

uniform mat4 TexGenMats[max_lights];
uniform mat4 InvViewMat;
varying vec3 normal, lightDir, eyeVec;

varying vec4 projCoord[max_lights];

void main()
{   
   normal = gl_NormalMatrix * gl_Normal;
   
   vec4 posEye =  gl_ModelViewMatrix * gl_Vertex;
   vec4 posWorld = InvViewMat * posEye;
   
   for (int i=0; i < max_lights; ++i) {
     projCoord[i] = TexGenMats[i] * posWorld;   
   }
   
   gl_TexCoord[0] = gl_MultiTexCoord0;     
   

   lightDir = vec3(gl_LightSource[0].position.xyz - posEye.xyz);
   eyeVec = -posEye.xyz;

   gl_Position = ftransform();      
}


Fragment
Code:
#version 120
const int max_lights =10;

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

uniform vec4 LampColors[max_lights];       //Lichtfarbe und intensität
uniform int GoboIndex[max_lights];          //gibt an welcher Gobo Sampler projeziert werden soll
uniform vec4 AmbientColor;               //Umgebungsfarbe

varying vec3 normal, lightDir, eyeVec;
varying vec4 projCoord[max_lights];


void main (void)
{


  vec4 ProjMapColor = vec4(0.0, 0.0, 0.0, 0.0);

 
 vec4  final_color = AmbientColor;
 
  //Projektion für jede Lampe
 
 for (int i=0; i < max_lights; ++i)
  if (GoboIndex[i]>=0)
   { 
    if(projCoord[i].q<0.0) {   
           
       if (GoboIndex[i]==0) {
               ProjMapColor = texture2DProj(projMap0, projCoord[i])* LampColors[i];
               }   else
       if (GoboIndex[i]==1) {      
               ProjMapColor = texture2DProj(projMap1, projCoord[i])* LampColors[i];
               } else             
       if (GoboIndex[i]==2) {
               ProjMapColor = texture2DProj(projMap2, projCoord[i])* LampColors[i];
               } else            
       if (GoboIndex[i]==3)
               ProjMapColor = texture2DProj(projMap3, projCoord[i])* LampColors[i];         
   
    final_color += ProjMapColor;
    }
  }

 
 
  gl_FragColor =  final_color * texture2D(Texture0, gl_TexCoord[0].xy);         
}


anbei noch 2 Fotos wies aussieht...


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Okt 06, 2010 13:39 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Das "Vor allem wenn ich nah ander Geometrie bin" deutet darauf hin das es ein Problem mit der Speicherbandbreite gibt. Denn dann muss die Textur in der maximalen Auflösung abgefragt werden. Versuche die Auflösung der Projektionstexturen verringern. Falls noch nicht geschehen solltest du zudem Mipmaps generieren lassen.

Darüber hinaus solltest du natürlich nur die Lichtquellen berechnen die auch wirklich auf das aktuelle Objekt einen Einfluss haben.

Wenn du viele verdeckte Objekte in der Szene hast könnte des weiteren ein dem Deferred_Shading ähnlicher Ansatz sinnvoll sein.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Okt 06, 2010 13:51 
Offline
DGL Member

Registriert: Do Apr 22, 2010 17:17
Beiträge: 543
Nun die zu projezierenden Grafiken sind schon 32x32 Pixel klein.. :-). Wenn ich allerdings die Anzahl der schleifen im Shader auf ca 4 verringere, dann hab ich eine fps von ca 40.. Dafür erhöht sich dann aber die Anzahl der Renderpasses.. was die CPU last in die höhe treibt..


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Okt 06, 2010 14:27 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Also bei meiner Geforce 9800 GT habe ich GL_MAX_VARYING_FLOATS_ARB = 60. Entsprechend ist ein Array von 20 vec4 als Varying problematisch, den es bedeutet das pro Vertex immerhin 320 Byte für diese Varyings drauf gehen. Wenn der Cache nicht reicht um ausreichend viele Vertices / Fragmente zu speichern können ggf. nicht alle ShaderUnits genutzt werden und die Performance geht in den Keller.

Eigentlich brauchst du nur ein vec3, die dritte (oder vierte) Koordinate ist ja ungenutzt. Damit würdest du schon mal 20 floats sparen. Die Frage ist natürlich ob der nicht sowieso vec4 benutzt wie das bei Uniforms der Fall ist.

Ansonsten kannst du mal versuchen nur posWorld als Varying zu übergeben und die Multiplikation mit der Texturmatrix im Fragmentshader durchzuführen. Wäre der klassische Trade-Off von Rechenleistung gegen Speicher.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Okt 06, 2010 15:16 
Offline
DGL Member

Registriert: Do Apr 22, 2010 17:17
Beiträge: 543
bei mir zeigt er da auch 60 an. Doch ist das jetzt die max Anzahl an vec4 Varyings oder die anzahl der max Bytes?
Also an 60 Projektionen gleichzeitig im Shader brauch ich garnicht zu denken.. Wie gesagt schon bei 10-15 wird kritisch..


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Okt 06, 2010 16:35 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
Doch ist das jetzt die max Anzahl an vec4 Varyings oder die anzahl der max Bytes?

Naja, es heißt "FLOATS"....ein vec4 besteht aus 4 floats. Ggf. schaust du aber einfach mal in die Spec.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Okt 06, 2010 16:56 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Dez 11, 2009 08:02
Beiträge: 532
Programmiersprache: pascal (Delphi 7)
Zitat:
Naja, es heißt "FLOATS"....ein vec4 besteht aus 4 floats.
In den Specs stand aber glaub ich, dass ein Float ggf nen ganzen vec4 brauchen kann. Um die maximale Anzahl an vec4 abzufragen gabs soweit ich weiß aber auch was. Weiß aber jetzt nicht, wie das heißt


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 » OpenGL


Wer ist online?

Mitglieder in diesem Forum: Bing [Bot] und 3 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 | 16 Queries | GZIP : On ]