DGL
https://delphigl.com/forum/

Shader performance
https://delphigl.com/forum/viewtopic.php?f=20&t=4269
Seite 1 von 3

Autor:  Aya [ Fr Jun 10, 2005 19:19 ]
Betreff des Beitrags:  Shader performance

Hi,

ich bin am verzweifeln mit Shadern.... entweder ich mache was grundlegend falsch oder meine Grafikkarte (GeForce FX5900XT) packt es einfach nich...

Ladet euch mal bitte diesen ShaderTest hier von mir runter.. meine GraKa schafft hier nicht mehr als 35fps... aber da ist nicht mehr drin als 2 PointLights...

Wäre super wenn ihr mir mal sagt wieviel FPS das bei euch so hat.

Download Link: http://www.koshigaya.de/DelphiGL/ShaderFPSTest.rar (~260kb, rar)

Jetzt hier noch der Shader (evtl sieht ja wer auf den ersten blick was falsch ist).

VertexShader:
Code:
  1. varying vec4 vertexPosition;
  2. varying vec3 vertexNormal;
  3. void main(void)
  4. {
  5.   gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
  6.   gl_FrontColor = gl_Color;
  7.   vertexPosition = gl_ModelViewProjectionMatrix * gl_Vertex;
  8.   vertexNormal = normalize(gl_NormalMatrix * gl_Normal);
  9.   gl_TexCoord[0] = gl_MultiTexCoord0;
  10. }


PixelShader:
Code:
  1. uniform vec4 pointLight1Position;
  2. uniform vec4 pointLight1Color;
  3. uniform float pointLight1Intensity;
  4. uniform float pointLight1DropOff;
  5. uniform float pointLight1Radius;
  6. uniform vec4 pointLight2Position;
  7. uniform vec4 pointLight2Color;
  8. uniform float pointLight2Intensity;
  9. uniform float pointLight2DropOff;
  10. uniform float pointLight2Radius;
  11. uniform sampler2D Texture0;
  12. uniform vec4 cameraPosition;
  13. uniform vec4 globalLight;
  14. varying vec4 vertexPosition;
  15. varying vec3 vertexNormal;
  16.  
  17. vec4 calcPointLight(vec3 vtxNormal, vec4 vtxPosition, vec4 lightPosition, float lightIntensity, float lightDropOff, float lightRadius,vec4 lightColor)
  18. {
  19.   vec4 outColor = vec4(0, 0, 0, 1);
  20.   float Intensity = (1.0 - ((1.0 / lightDropOff) * (distance(lightPosition.xyz, vtxPosition.xyz) - lightRadius))) * lightIntensity;
  21.   if (Intensity > 0.0) {
  22.     outColor = Intensity * lightColor;
  23.     if (outColor.r < 0.0) outColor.r = 0.0;
  24.     if (outColor.g < 0.0) outColor.g = 0.0;
  25.     if (outColor.b < 0.0) outColor.b = 0.0;
  26.   }
  27.   return outColor;
  28. }
  29.  
  30. void main(void)
  31. {
  32.   vec4 tex0 = texture2D(Texture0, vec2(gl_TexCoord[0]));
  33.   float angle = acos(dot(normalize(vertexNormal.xyz), normalize(cameraPosition.xyz - vertexPosition.xyz))) * 0.318309;
  34.   vec4 pointLight1Out = calcPointLight(vertexNormal, vertexPosition, pointLight1Position, pointLight1Intensity, pointLight1DropOff, pointLight1Radius, pointLight1Color);
  35.   vec4 pointLight2Out = calcPointLight(vertexNormal, vertexPosition, pointLight2Position, pointLight2Intensity, pointLight2DropOff, pointLight2Radius, pointLight2Color);
  36.   vec4 lights = vec4(0);
  37.   vec4 pointLights = vec4(0);
  38.   pointLights += pointLight1Out + pointLight2Out;
  39.   lights += pointLights;
  40.   lights += globalLight;
  41.   gl_FragColor = tex0 * angle * lights;
  42. }


Hilfe :)

Au'revoir,
Aya~

//Edit: Die angesprochenen fehler im Shader ausgebessert (Die, weswegen er auf ATI Karten nicht lief.)

Autor:  La Boda [ Fr Jun 10, 2005 19:29 ]
Betreff des Beitrags: 

Ich kann das Proggi nicht starten, der Fehler dürfte selbsterklärend sein:
Zitat:
---------------------------
Anwendungsfehler
---------------------------
Exception EFOpenError in Modul ShaderFPSTest.exe bei 0002ED3A.

Datei K:\Delphi\-=OpenGL=-\TexturePanel\Data\TimesNewRoman10.dat kann nicht geöffnet werden.


---------------------------
OK
---------------------------


€: Hab mir den Code mal kurz durchgeschaut. Das erste, was mir auffiel, war der lange Fragmentshader, du solltest wahrscheinlich mehr in Vertexshader und Delphi-Code auslagern. Auch die häufige Verwendung von "normalize" ist sehr performancelastig, bedenke, dass da sehr oft pro Frame (!) Wurzeln (!) gezogen werden müssen.

Autor:  Aya [ Fr Jun 10, 2005 19:45 ]
Betreff des Beitrags: 

Whow.. shit *g* Sorry... ich hatte eigentlich extra drauf geachtet alle absoluten pfade zu entfernen, aber den einen hab ich dummerweise übersehen ;)

Jetzt sollte es gehen...

PS: Hab es grad auf nem anderen Rechner hier versucht... GeForceFX6800 oder sowas in dem dreh... 140fps... das is deprimierend :(

Autor:  Grizzly [ Fr Jun 10, 2005 19:58 ]
Betreff des Beitrags: 

habs grad auf meiner Radeon 9500Pro ausprobiert. Läuft zwar mit 85 Frames, der Hacken ist allerdings, dass er nen Fehler ausgibt, dass der Shader nicht Compiliert werden konnte.
Scheint also noch was drin zu sein, was radeons nich gerne fressen

Autor:  Aya [ Fr Jun 10, 2005 20:00 ]
Betreff des Beitrags: 

Grizzly hat geschrieben:
habs grad auf meiner Radeon 9500Pro ausprobiert. Läuft zwar mit 85 Frames, der Hacken ist allerdings, dass er nen Fehler ausgibt, dass der Shader nicht Compiliert werden konnte.
Scheint also noch was drin zu sein, was radeons nich gerne fressen

Oh.. magst du mir mal die Fehlermeldung kopieren?? (einfach CTRL+C in dem MessageFenster mit der Meldung drücken) ;)

Autor:  Grizzly [ Fr Jun 10, 2005 20:54 ]
Betreff des Beitrags: 

---------------------------
Shaderfpstest
---------------------------
Link failed. All shader objects have not been successfully compiled.
---------------------------
OK
---------------------------

Standardmeldung halt

Autor:  Aya [ Fr Jun 10, 2005 21:29 ]
Betreff des Beitrags: 

Hi,

ok.. damit kann ich weniger anfangen ;)

Magst du mal versuchen rauszubekommen woran es liegt???
hab den Shader ja oben gepostet.. kannst ja mal zeilenweise auskommentieren o.Ä..

Kann es selber leider nicht machen, da wir hier in der gesamten Uni nicht einen einzigen rechner mit ATI GraKa haben...

Au'revoir,
Aya~

Autor:  Grizzly [ Fr Jun 10, 2005 22:24 ]
Betreff des Beitrags: 

hab mir mal SoSs Shadereditor geschnappt und die Fehler durchgesucht. So gibt der mir wenigstens keine Fehlermeldungen für die mehr aus:
Code:
  1. uniform vec4 pointLight1Position;
  2. uniform vec4 pointLight1Color;
  3. uniform float pointLight1Intensity;
  4. uniform float pointLight1DropOff;
  5. uniform float pointLight1Radius;
  6. uniform vec4 pointLight2Position;
  7. uniform vec4 pointLight2Color;
  8. uniform float pointLight2Intensity;
  9. uniform float pointLight2DropOff;
  10. uniform float pointLight2Radius;
  11. uniform sampler2D Texture0;
  12. uniform vec4 cameraPosition;
  13. uniform vec4 globalLight;
  14. varying vec4 vertexPosition;
  15. varying vec3 vertexNormal;
  16.  
  17. vec4 calcPointLight(vec3 vtxNormal, vec4 vtxPosition, vec4 lightPosition, float lightIntensity, float lightDropOff, float lightRadius,vec4 lightColor)
  18. {
  19.   vec4 outColor = vec4(0, 0, 0, 1);
  20.   float Intensity = (1.0 - ((1.0 / lightDropOff) * (distance(lightPosition.xyz, vtxPosition.xyz) - lightRadius))) * lightIntensity;
  21.   if (Intensity > 0.0) {
  22.     outColor = Intensity * lightColor;
  23.     if (outColor.r < 0.0) outColor.r = 0.0;
  24.     if (outColor.g < 0.0) outColor.g = 0.0;
  25.     if (outColor.b < 0.0) outColor.b = 0.0;
  26.   }
  27.   return outColor;
  28. }
  29.  
  30. void main(void)
  31. {
  32.   vec4 tex0 = texture2D(Texture0, vec2(gl_TexCoord[0]));
  33.   float angle = acos(dot(normalize(vertexNormal.xyz), normalize(cameraPosition.xyz - vertexPosition.xyz))) * 0.318309;
  34.   vec4 pointLight1Out = calcPointLight(vertexNormal, vertexPosition, pointLight1Position, pointLight1Intensity, pointLight1DropOff, pointLight1Radius, pointLight1Color);
  35.   vec4 pointLight2Out = calcPointLight(vertexNormal, vertexPosition, pointLight2Position, pointLight2Intensity, pointLight2DropOff, pointLight2Radius, pointLight2Color);
  36.   vec4 lights = vec4(0);
  37.   vec4 pointLights = vec4(0);
  38.   pointLights += pointLight1Out + pointLight2Out;
  39.   lights += pointLights;
  40.   lights += globalLight;
  41.   gl_FragColor = tex0 * angle * lights;
  42. }


die Fehler waren hier:
vec4 lights = 0;
vec4 pointLights = 0;

Und hier:
if (Intensity > 0) {
outColor = Intensity * lightColor;
if (outColor.r < 0) outColor.r = 0;
if (outColor.g < 0) outColor.g = 0;
if (outColor.b < 0) outColor.b = 0;

Radeon Hardware mags da nicht Vergleichen / Zuweisungen von unterschiedlichen Datentypen, sondern hält sich da verdammt genau an die vorgaben. Das auf den NVidia karten ja lief war letzlich schon abzusehen, dass das vermutlich sowas sein musste.

wirklich testen werd ich den heute aber nicht mehr

Autor:  Aya [ Sa Jun 11, 2005 14:50 ]
Betreff des Beitrags: 

Hi,

tausend dank :)
hab es verbessert und neu hochgeladen.


Wär super wenn jetzt einige mal schauen wieviel FPS sie haben bei dem ding ;)

Au'revoir,
Aya~

Autor:  LH_Freak [ Sa Jun 11, 2005 15:43 ]
Betreff des Beitrags: 

Aya hat geschrieben:
Oh.. magst du mir mal die Fehlermeldung kopieren?? (einfach CTRL+C in dem MessageFenster mit der Meldung drücken) ;)


Danke für den Tipp, wußte ich gar nicht

Autor:  DCW_Mr_T [ So Jun 12, 2005 13:52 ]
Betreff des Beitrags: 

Also bei mir läuft das ganze (eben gezogen) bei 41 bis 43 FPS.

System:
Athlon XP 2600+
Asus A7N8x-VM (Nforce 2 IGP)
ATI Radeon 9600 Pro / EZ (Chip: 400 / Speicher: 400)
Treiber: Catalyst 5.2 mit Control Panel
Sys: Win XP SP2


Edit:
Eine sehr interissante Entwicklung: Ich habe eben mal den Catalyst 5.6 mit Control Center drauf gemacht...
Ergebnis: 47 bis 51 Frames per Second! (Schnitt 48)
Was so ein neuer Treiber doch bringen kann ^^

Autor:  Grizzly [ So Jun 12, 2005 16:55 ]
Betreff des Beitrags: 

keine Ursache

Bei mir (XP2600+, Radeon 9500Pro, aber etwas ältere Treiber) läufts auch mit ~40 fps

Autor:  KidPaddle [ So Jun 12, 2005 17:42 ]
Betreff des Beitrags: 

Kraz am Kopf, ATI 9800pro, gerade neuesten Treiber installiert und bekomme immer noch eine Fehlermeldung, das nicht alle Shader kompiliert werden können.

Gruß
KidPaddle

Autor:  LarsMiddendorf [ So Jun 12, 2005 18:09 ]
Betreff des Beitrags: 

Bei mir GF 6800 GT läuft es mit ca 250 fps. So richtig schnell ist das aber nicht. Kann mich errinern, dass zwar nur ein 1 Licht mit Intensität,Diffuse,Specular,Bumpmapping aber auf der GF4 auch auf ca 250fps kam.

Autor:  Aya [ So Jun 12, 2005 18:23 ]
Betreff des Beitrags: 

LarsMiddendorf hat geschrieben:
So richtig schnell ist das aber nicht. Kann mich errinern, dass zwar nur ein 1 Licht mit Intensität,Diffuse,Specular,Bumpmapping aber auf der GF4 auch auf ca 250fps kam.

Mh.. ja, mir kommt das auch langsam vor, daher ja die frage wegen der Performance hier... hast du irgend ne idee woran das liegen könnte??? Ist in dem Shader irgendwas total verkehrt???

Hier nochmal der Code wie ich den Shader erstelle/binde und wie ich Attribute übergebe:

Code:
  1.   VertexShaderText:=VertexShader.Text;
  2.   PixelShaderText:=PixelShader.Text;
  3.   VertexSize:=Length(VertexShaderText);
  4.   PixelSize:=Length(PixelShaderText);
  5.  
  6.   if glIsProgramARB(ShaderID) then
  7.     glDeleteProgramsARB(1, @ShaderID);
  8.   ShaderID:=glCreateProgramObjectARB;
  9.   VertexShaderObject:=glCreateShaderObjectARB(GL_VERTEX_SHADER_ARB);
  10.   PixelShaderObject:=glCreateShaderObjectARB(GL_FRAGMENT_SHADER_ARB);
  11.   glShaderSourceARB(VertexShaderObject, 1, @VertexShaderText, @VertexSize);
  12.   glShaderSourceARB(PixelShaderObject, 1, @PixelShaderText, @PixelSize);
  13.   glCompileShaderARB(VertexShaderObject);
  14.   glCompileShaderARB(PixelShaderObject);
  15.   glAttachObjectARB(ShaderID, VertexShaderObject);
  16.   glAttachObjectARB(ShaderID, PixelShaderObject);
  17.   glLinkProgramARB(ShaderID);
  18.   glDeleteObjectARB(VertexShaderObject);
  19.   glDeleteObjectARB(PixelShaderObject);


Attribute übergeben:
Code:
  1.   glUniform4fARB(glGetUniformLocationARB(ShaderID, PGLCharARB('globalLight')), 0.2, 0.2, 0.2, 1);
  2.  
  3.   glUniform4fARB(glGetUniformLocationARB(ShaderID, PGLCharARB('pointLight1Position')), 10, 5, 0, 0);
  4.   glUniform4fARB(glGetUniformLocationARB(ShaderID, PGLCharARB('pointLight1Color')), 1, 1, 0, 1);
  5.   glUniform1fARB(glGetUniformLocationARB(ShaderID, PGLCharARB('pointLight1Intensity')), 0.75);
  6.   glUniform1fARB(glGetUniformLocationARB(ShaderID, PGLCharARB('pointLight1DropOff')), 5);
  7.   glUniform1fARB(glGetUniformLocationARB(ShaderID, PGLCharARB('pointLight1Radius')), 14);
  8.  
  9.   glUniform4fARB(glGetUniformLocationARB(ShaderID, PGLCharARB('pointLight2Position')), -5, 2, 0, 0);
  10.   glUniform4fARB(glGetUniformLocationARB(ShaderID, PGLCharARB('pointLight2Color')), 0, 0, 1, 1);
  11.   glUniform1fARB(glGetUniformLocationARB(ShaderID, PGLCharARB('pointLight2Intensity')), 1);
  12.   glUniform1fARB(glGetUniformLocationARB(ShaderID, PGLCharARB('pointLight2DropOff')), 7);
  13.   glUniform1fARB(glGetUniformLocationARB(ShaderID, PGLCharARB('pointLight2Radius')), 20);


Hat irgendwer irgendne idee wieso es so langsam ist???

Au'revoir,
Aya~

PS: Mit Space kann man den Shader in dem Test btw deaktivieren.. also an der art wie ich objekte zeichne etc kann es nicht liegen, denn ohne Shader sind es über 500fps bei meiner GraKa hier...

Seite 1 von 3 Alle Zeiten sind UTC + 1 Stunde
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/