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

Aktuelle Zeit: So Aug 03, 2025 16:01

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



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

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
Hi,

hab jetzt eben nochmal am Shader rumgebastelt und geschaut was geschwindigkeit ausmacht...

z.B. dieser Teil hier:
Code:
  1.   if (Intensity > 0.0) {
  2.     outColor = Intensity * lightColor;
  3.     if (outColor.r < 0.0) outColor.r = 0.0;
  4.     if (outColor.g < 0.0) outColor.g = 0.0;
  5.     if (outColor.b < 0.0) outColor.b = 0.0;
  6.   }
  7.  
  8. //jetzt  ersetzt duch:
  9.     outColor = Intensity * lightColor;


hat allein knapp 20fps bei mir ausgemacht...

oder etwas wie
Code:
  1. 1.0 / lightDropOff
  2. //ich rechne jetzt das 1/.. auf der CPU vor der parameter übergabe

hat auch nochmal ein paar fps gebracht...


Hier der neue Shader:
Code:
  1. uniform vec4 cameraPosition;
  2. varying vec4 vertexPosition;
  3. varying vec3 vertexNormal;
  4. varying vec3 camVtxPos;
  5. void main(void)
  6. {
  7.   gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
  8.   gl_FrontColor = gl_Color;
  9.   vertexPosition = gl_ModelViewProjectionMatrix * gl_Vertex;
  10.   vertexNormal = normalize(gl_NormalMatrix * gl_Normal);
  11.   camVtxPos = normalize(cameraPosition.xyz - vertexPosition.xyz);
  12.   gl_TexCoord[0] = gl_MultiTexCoord0;
  13. }


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. varying vec3 camVtxPos;
  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 - (lightDropOff * (distance(lightPosition.xyz, vtxPosition.xyz) - lightRadius))) * lightIntensity;
  21.   outColor = Intensity * lightColor;
  22.   return outColor;
  23. }
  24.  
  25. void main(void)
  26. {
  27.   vec4 tex0 = texture2D(Texture0, vec2(gl_TexCoord[0]));
  28.   float angle = acos(dot(vertexNormal.xyz, camVtxPos.xyz)) * 0.318309;
  29.   vec4 pointLight1Out = calcPointLight(vertexNormal, vertexPosition, pointLight1Position, pointLight1Intensity, pointLight1DropOff, pointLight1Radius, pointLight1Color);
  30.   vec4 pointLight2Out = calcPointLight(vertexNormal, vertexPosition, pointLight2Position, pointLight2Intensity, pointLight2DropOff, pointLight2Radius, pointLight2Color);
  31.   vec4 lights = vec4(0.0, 0.0, 0.0, 0.0);
  32.   vec4 pointLights = vec4(0.0, 0.0, 0.0, 0.0);
  33.   pointLights += pointLight1Out + pointLight2Out;
  34.   lights += pointLights;
  35.   lights += globalLight;
  36.   gl_FragColor = tex0 * angle * lights;
  37. }


Sieht nochjemand punkte die man irgendwie geschickter lösen könnte??

Au'revoir,
Aya~

PS: Hab die neue version mal hochgeladen, wäre super wenn ihr mal schauen könntet wieviel FPS es jetzt bei euch hat :)


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

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
Hi,

hab jetzt eben nochmal am Shader rumgebastelt und geschaut was geschwindigkeit ausmacht...

z.B. dieser Teil hier:
Code:
  1.   if (Intensity > 0.0) {
  2.     outColor = Intensity * lightColor;
  3.     if (outColor.r < 0.0) outColor.r = 0.0;
  4.     if (outColor.g < 0.0) outColor.g = 0.0;
  5.     if (outColor.b < 0.0) outColor.b = 0.0;
  6.   }
  7.  
  8. //jetzt  ersetzt duch:
  9.     outColor = Intensity * lightColor;


hat allein knapp 20fps bei mir ausgemacht...

oder etwas wie
Code:
  1. 1.0 / lightDropOff
  2. //ich rechne jetzt das 1/.. auf der CPU vor der parameter übergabe

hat auch nochmal ein paar fps gebracht...


Hier der neue Shader:
Code:
  1. uniform vec4 cameraPosition;
  2. varying vec4 vertexPosition;
  3. varying vec3 vertexNormal;
  4. varying vec3 camVtxPos;
  5. void main(void)
  6. {
  7.   gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
  8.   gl_FrontColor = gl_Color;
  9.   vertexPosition = gl_ModelViewProjectionMatrix * gl_Vertex;
  10.   vertexNormal = normalize(gl_NormalMatrix * gl_Normal);
  11.   camVtxPos = normalize(cameraPosition.xyz - vertexPosition.xyz);
  12.   gl_TexCoord[0] = gl_MultiTexCoord0;
  13. }


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. varying vec3 camVtxPos;
  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 - (lightDropOff * (distance(lightPosition.xyz, vtxPosition.xyz) - lightRadius))) * lightIntensity;
  21.   outColor = Intensity * lightColor;
  22.   return outColor;
  23. }
  24.  
  25. void main(void)
  26. {
  27.   vec4 tex0 = texture2D(Texture0, vec2(gl_TexCoord[0]));
  28.   float angle = acos(dot(vertexNormal.xyz, camVtxPos.xyz)) * 0.318309;
  29.   vec4 pointLight1Out = calcPointLight(vertexNormal, vertexPosition, pointLight1Position, pointLight1Intensity, pointLight1DropOff, pointLight1Radius, pointLight1Color);
  30.   vec4 pointLight2Out = calcPointLight(vertexNormal, vertexPosition, pointLight2Position, pointLight2Intensity, pointLight2DropOff, pointLight2Radius, pointLight2Color);
  31.   vec4 lights = vec4(0.0, 0.0, 0.0, 0.0);
  32.   vec4 pointLights = vec4(0.0, 0.0, 0.0, 0.0);
  33.   pointLights += pointLight1Out + pointLight2Out;
  34.   lights += pointLights;
  35.   lights += globalLight;
  36.   gl_FragColor = tex0 * angle * lights;
  37. }


Sieht nochjemand punkte die man irgendwie geschickter lösen könnte??

Au'revoir,
Aya~

PS: Hab die neue version mal hochgeladen, wäre super wenn ihr mal schauen könntet wieviel FPS es jetzt bei euch hat :)


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

Registriert: Sa Sep 21, 2002 21:32
Beiträge: 346
Wohnort: Eilsum (Nahe Emden)
Also in diesem Falle muss man sich echt wundern, was so ein paar kleine Änderungen doch ausmachen können: 88 bis 90 FPS bringt die Radeon nun ... also von 50 auf 90 ist schon nicht unerheblich ;)

_________________
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 20:29 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Das acos sollte auch nich unbedingt raus.
Unter D3D gibt's Preshader. Da werden die Ausdrücke, die nur von uniform Variablen abhängen vom Shader Compiler in den Preshader verschoben und dann auf automatisch auf der CPU berechnet. So etwas sollte eigentlich oder gerade in glsl, weil das alles so verkapselt ist, mittlerweile auch mal drin sein.
Lass dir mal per NVEmulate Tool die Assembler Versionen der Shader ausgeben. Das Tool kann man bei NVidia laden.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jun 13, 2005 19:46 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Nov 13, 2004 11:00
Beiträge: 229
Wohnort: Steinhude
würde auch sagen, dass das acos da raus sollte.

weiteres:
im Vertexshader:
Code:
  1.  
  2.  gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
  3.   gl_FrontColor = gl_Color;
  4.   vertexPosition =gl_ModelViewProjectionMatrix * gl_Vertex;
  5.  

ich bin mir zwar nich sicher, wie das intern abläuft, aber ich denke man könnte es sich da sparen die Matrixmultiplikation 2 mal auszuführen und stattdessen
Code:
  1. vertexPosition = gl_Position
setzen

im Fragmentshader könnte man vll noch die ganzen nullinitialisierungen weglassen:
Code:
  1.   //vec4 outColor = vec4(0, 0, 0, 1);
  2.   float Intensity = (1.0 - (lightDropOff * (distance(lightPosition.xyz, vtxPosition.xyz) - lightRadius))) * lightIntensity;
  3.   vec4 outColor = Intensity * lightColor;
  4.  



Code:
  1.  
  2.   //vec4 lights = vec4(0.0, 0.0, 0.0, 0.0);
  3.   //vec4 pointLights = vec4(0.0, 0.0, 0.0, 0.0);
  4.   //pointLights += pointLight1Out + pointLight2Out;
  5.   vec4 lights = pointLight1Out + pointLight2Out +  globalLight;
  6.   //lights += globalLight;
  7.  

weiß zwar nichob das jetzt ungemein geschwindigkeit bringt (schätz mal eher nich)
aber der shader wird dadurch immerhin kürzer und schneller lesbar

@DCW_Mr_T
so verwunderlich is das garnich, da unsere Karten die slang spezifikationen noch nich voll unterstützen insbesondere in sachen bedingte sprünge und sowas dort dementsprechend langsam ist.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jun 13, 2005 21:56 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
Hi,

hab das acos jetzt in den VS statt PS gepackt und die eine null initialisierung entfernt.
Hat ca. nochmal 40fps ausgemacht :)

Hab es neu hochgeladen und jetzt mal die Shader als TXT file dazugepackt... jetzt könnt ihr, falls ihr auch ausprobieren wollt wie man sie noch optimieren kann einfach die TXT's ändern, TestProg neustarten und schauen ;) (Natürlich noch hier bescheid sagen wenn ihr es noch schneller bekommen habt)

Au'revoir,
Aya~


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jun 13, 2005 22:02 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Pack den Shader doch als Text dabei. Dann kann jeder ausprobieren.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jun 13, 2005 22:07 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
LarsMiddendorf hat geschrieben:
Pack den Shader doch als Text dabei. Dann kann jeder ausprobieren.

Hab ich doch extra geschrieben das ich das gemacht habe ;)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jun 13, 2005 22:08 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Hast du das nachträglich editiert oder habe ich das beim ersten Lesen übersehen?
Im Archiv ist irgendwie kein Text.


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

Registriert: Sa Nov 13, 2004 11:00
Beiträge: 229
Wohnort: Steinhude
Hast du den download upgedatet oder nen neuen angelegt? weil ich find den da nich als textdatei.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jun 13, 2005 22:11 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
LarsMiddendorf hat geschrieben:
Hast du das nachträglich editiert oder habe ich das beim ersten Lesen übersehen?
Im Archiv ist irgendwie kein Text.

Hast du überlesen denke ich, editiert hab ich nix :)

Muß aber gestehen das ich die falsche version hochgeladen habe... jetzt sind die TXT's dabei ;)

Au'revoir,
Aya~


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jun 14, 2005 12:54 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Nov 13, 2004 11:00
Beiträge: 229
Wohnort: Steinhude
was mir aufgefallen ist, dass das programm manchmal beim beenden meinen 2. Monitor ausschaltet. Wär vll. schön wenn du rausfindest, woran das liegen könnte.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jun 14, 2005 15:22 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
Grizzly hat geschrieben:
was mir aufgefallen ist, dass das programm manchmal beim beenden meinen 2. Monitor ausschaltet. Wär vll. schön wenn du rausfindest, woran das liegen könnte.


Umh... ok, schau ich mal... ich arbeite aber auch mit 2 Monitoren und hab nochnie so ein problem gehabt... aber mal schauen, evtl find ich was..

Au'revoir,
Aya~


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jun 14, 2005 16:43 
Offline
DGL Member

Registriert: Mo Jan 20, 2003 20:10
Beiträge: 424
Wohnort: nähe Starnberg
Ich kann jetzt die Anwendung ausführen. Allerdings wird eine Warning beim start ausgegeben, die wie folgt lautet:

---------------------------
Shaderfpstest
---------------------------
Warning: varying camVtxPos is written to in the vertex shader but not read in the fragment shader.
Link successful. The GLSL vertex shader will run in hardware. The GLSL fragment shader will run in hardware.
---------------------------
OK
---------------------------

Ansonsten läuft ds Programm mit 250FPS auf einer ATI Radeon9800pro 265MB, 2.4GHz PIV.

Gruß
KidPaddle

_________________
http://www.seban.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jun 20, 2005 10:14 
Offline
DGL Member

Registriert: Fr Nov 12, 2004 14:58
Beiträge: 76
Wohnort: Aachen
~200fps
System:
WinXP, 512MB RAM, GF6600 256MB RAM, Celeron 2GHz, DualMonitor Betrieb

_________________
Ein Schiff im Hafen ist sicher. Aber dafür werden Schiffe nicht gebaut. (Engl. Sprichwort)


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 Vorherige  1, 2, 3  Nächste
Foren-Übersicht » Programmierung » Shader


Wer ist online?

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