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

Aktuelle Zeit: So Aug 03, 2025 13:57

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



Ein neues Thema erstellen Auf das Thema antworten  [ 31 Beiträge ]  Gehe zu Seite 1, 2, 3  Nächste
Autor Nachricht
 Betreff des Beitrags: Shader performance
BeitragVerfasst: Fr Jun 10, 2005 19:19 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
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.)


Zuletzt geändert von Aya am So Jun 12, 2005 18:24, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jun 10, 2005 19:29 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jul 17, 2002 12:07
Beiträge: 976
Wohnort: Tübingen
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.

_________________
"Du musst ein Schwein sein in dieser Welt, sangen die Prinzen, das ist so 1.0. Du musst auf YouTube zeigen, dass dir dein Schweinsein gefällt, das ist leuchtendes, echtes Web 2.0."
- Hal Faber

Meine Homepage: http://laboda.delphigl.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jun 10, 2005 19:45 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
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 :(


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jun 10, 2005 19:58 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Nov 13, 2004 11:00
Beiträge: 229
Wohnort: Steinhude
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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jun 10, 2005 20:00 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
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) ;)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jun 10, 2005 20:54 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Nov 13, 2004 11:00
Beiträge: 229
Wohnort: Steinhude
---------------------------
Shaderfpstest
---------------------------
Link failed. All shader objects have not been successfully compiled.
---------------------------
OK
---------------------------

Standardmeldung halt


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jun 10, 2005 21:29 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
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~


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jun 10, 2005 22:24 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Nov 13, 2004 11:00
Beiträge: 229
Wohnort: Steinhude
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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Jun 11, 2005 14:50 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
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~


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Jun 11, 2005 15:43 
Offline
DGL Member
Benutzeravatar

Registriert: So Dez 19, 2004 00:27
Beiträge: 454
Wohnort: Nürnberg
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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jun 12, 2005 13:52 
Offline
DGL Member

Registriert: Sa Sep 21, 2002 21:32
Beiträge: 346
Wohnort: Eilsum (Nahe Emden)
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 ^^

_________________
Es sind immer die guten,
welche zu früh von uns gehen müssen...

Meine bislang 13 Open Gl - Tuts findet ihr auf www.dcw-group.net
Neu! Ein großer Teil der Demos nach Kylix übersetzt!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jun 12, 2005 16:55 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Nov 13, 2004 11:00
Beiträge: 229
Wohnort: Steinhude
keine Ursache

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jun 12, 2005 17:42 
Offline
DGL Member

Registriert: Mo Jan 20, 2003 20:10
Beiträge: 424
Wohnort: nähe Starnberg
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

_________________
http://www.seban.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jun 12, 2005 18:09 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jun 12, 2005 18:23 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
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...


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


Wer ist online?

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