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

Aktuelle Zeit: Do Mär 28, 2024 13:34

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



Ein neues Thema erstellen Auf das Thema antworten  [ 10 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Spielerei mit Shader
BeitragVerfasst: Mo Aug 04, 2014 22:06 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1276
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Mit dem Shader kann man auch Spielereien machen.

Vertex-Shader:
Code:
  1. #version 130
  2. in vec3 inPos;
  3. in vec3 inColor;
  4.  
  5. uniform mat4 Matrix;
  6.  
  7. out vec4 Color;
  8. out vec4 p;
  9.  
  10. void main(void)
  11. {
  12.   gl_Position = Matrix * vec4(inPos, 1.0);
  13.   p = gl_Position;
  14.   Color = vec4(inColor, 1.0);
  15. }


Fragment-Shader:
Code:
  1. #version 130
  2. in vec4 Color;     // interpolierte Farbe vom Vertexshader
  3. out vec4 outColor; // ausgegebene Farbe
  4.  
  5. in vec4 p;
  6.  
  7. void main(void)
  8. {
  9.  
  10.   if ((p.x > -0.4) && (p.x < 0.4) && (p.y > -0.4) && (p.y < 0.4))
  11.   {
  12.     outColor = vec4(p.x * 2, p.y * 2, 0.0, 1.0);
  13.   }
  14.   else
  15.   {
  16.     outColor = Color;
  17.   }
  18. }


Dateianhänge:
Zwischenablage-1.jpg
Zwischenablage-1.jpg [ 19.5 KiB | 12490-mal betrachtet ]

_________________
OpenGL
Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Spielerei mit Shader
BeitragVerfasst: Di Aug 05, 2014 17:39 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1276
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Jetzt habe ich den Shader ein bisschen mehr gefordert. :lol:

Interessanterweise, habe ich den gleichen Code mit Pascal, und das Programm ist sehr lahm.

Das sieht man was für ein Power in der Grafik-Einheit steckt.

Code:
  1. #version 130
  2. in vec4 Color;
  3. out vec4 outColor;
  4.  
  5. in vec4 p;
  6.  
  7. float o = 1.2;
  8. float u = -1.2;
  9. float  l = -2.2;
  10. float  r = 1.2;
  11.  
  12. float maxX = 2;
  13. float maxY = 2;
  14.  
  15. float Farbe, x, y;
  16. float SqrX, SqrY, XPos, YPos, XStep, YStep, creal, cimag, links, rechts, oben, unten;
  17.  
  18. void main(void)
  19. {
  20.  
  21.     links = l;
  22.     rechts = r;
  23.     oben = o;
  24.     unten = u;
  25.     XStep = (rechts - links) / maxX;
  26.     YStep = (oben - unten) / maxY;
  27.  
  28.     creal = p.x * 1.5 - 0.3;
  29.  
  30.     cimag = p.y * 1.5;
  31.  
  32.     Farbe = 0;
  33.     XPos = 0;
  34.     YPos = 0;
  35.  
  36.     do
  37.     {
  38.         SqrX = XPos * XPos;
  39.         SqrY = YPos * YPos;
  40.         YPos = 2 * XPos * YPos + cimag;
  41.         XPos = SqrX - SqrY + creal;
  42.         Farbe += 1;
  43.     }
  44.     while (!((SqrX + SqrY > 8) || (Farbe > 100)));
  45.  
  46.     if (Farbe > 100)
  47.     {
  48.         Farbe = 0;
  49.     }
  50.  
  51.     outColor = vec4(Farbe / 100, Farbe / 100, Farbe / 100, 1.0);
  52. }
  53.  


Dateianhänge:
Zwischenablage-1.jpg
Zwischenablage-1.jpg [ 19.63 KiB | 12471-mal betrachtet ]

_________________
OpenGL
Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Spielerei mit Shader
BeitragVerfasst: Do Aug 07, 2014 17:27 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1276
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Zitat:
Interessanterweise, habe ich den gleichen Code mit Pascal, und das Programm ist sehr lahm.

Ich dachte es lege daran, das ich Real anstelle single verwendete, aber dies hatte keine grossen Unterschied gemacht.

Ist die GPU so viel schneller als der Mathe-Teil der CPU ?
Oderr läuft da etwa etwas anders. ?

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Spielerei mit Shader
BeitragVerfasst: Do Aug 07, 2014 18:11 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Nov 08, 2010 18:41
Beiträge: 769
Programmiersprache: Gestern
mathias hat geschrieben:
Zitat:
Interessanterweise, habe ich den gleichen Code mit Pascal, und das Programm ist sehr lahm.

Ich dachte es lege daran, das ich Real anstelle single verwendete, aber dies hatte keine grossen Unterschied gemacht.

Ist die GPU so viel schneller als der Mathe-Teil der CPU ?
Oderr läuft da etwa etwas anders. ?


Naja wenn man mal von herstellerspezifischen Kram, wie etwa die verwendeten Datentypen, absieht, dann hast du bei der GPU zwei große Vorteile:
- Du kannst mehr Sachen gleichzeitig machen.
- Du hast in der Regel schnelleren Speicher.

Dadurch kann der jeweilige Compiler halt auch ganz anderen Output erzeugen. Deine Schleife könnte zum Beispiel X mal gleichzeitig durchlaufen, wohingegen
auf der CPU alles nacheinander passiert. Außerdem musst du auch noch Bedenken das die GPU im Prinzip eine rein funktionale Geschichte ist und Pascal eben
Imperativ. Sprich du hast eigentlich gar keine Variablen sondern nur Parameter.

_________________
Meine Homepage


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Spielerei mit Shader
BeitragVerfasst: Do Aug 07, 2014 20:23 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
yunharla hat geschrieben:
- Du hast in der Regel schnelleren Speicher.

Das würde ich so nicht unterschreiben. Besonders die günstigeren Karten haben eher sowas wie 1200 MHz, was am unteren bis mittleren Rande des DDR3-Spektrums angesiedelt ist (da bin ich voll reingelaufen. meine GPU macht mit CUDA ne schlechtere Performance als meine CPU).

Ich würde die Parallelität da viel höher gewichten. Das ist ja der Grund, warum man viele Dinge nicht machen kann (Framebuffer gleichzeitig als Textur und als Render Target gebunden haben z.B.; da müsste man serialisieren, damit das hinhaut).

viele Grüße,
Horazont

_________________
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: Spielerei mit Shader
BeitragVerfasst: Do Aug 07, 2014 20:47 
Offline
DGL Member

Registriert: Do Dez 29, 2011 19:40
Beiträge: 421
Wohnort: Deutschland, Bayern
Programmiersprache: C++, C, D, C# VB.Net
Zitat:
Framebuffer gleichzeitig als Textur und als Render Target gebunden haben

Das geht aber zum Beispiel mit "NV_texture_barrier".


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Spielerei mit Shader
BeitragVerfasst: Fr Aug 08, 2014 17:03 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Nov 08, 2010 18:41
Beiträge: 769
Programmiersprache: Gestern
Lord Horazont hat geschrieben:
yunharla hat geschrieben:
- Du hast in der Regel schnelleren Speicher.

Das würde ich so nicht unterschreiben. Besonders die günstigeren Karten haben eher sowas wie 1200 MHz, was am unteren bis mittleren Rande des DDR3-Spektrums angesiedelt ist (da bin ich voll reingelaufen. meine GPU macht mit CUDA ne schlechtere Performance als meine CPU).

Ich würde die Parallelität da viel höher gewichten. Das ist ja der Grund, warum man viele Dinge nicht machen kann (Framebuffer gleichzeitig als Textur und als Render Target gebunden haben z.B.; da müsste man serialisieren, damit das hinhaut).

viele Grüße,
Horazont


Das kommt ganz darauf an was man darunter Versteht. Ich habe hier jetzt keine aktuellen Zahlen im Kopf, es kann also mittlerweile auch schneller sein.

Du musst hier zwischen Off- und On-Chip Speicher unterscheiden. Beim Off-Chip Speicher besteht im Prinzip kein Unterschied zur CPU. Sprich je nach Qualitaet der Ware bekommst du mal schnelleren oder langsameren Speicher. Der On-Chip Speicher ist hingegen der Grosse Unterschied im Vergleich zur CPU. Denn hier sind einfach mehr Baenke zur Verfuegung als auf der CPU und man ist somit schneller.

Beim Off-Chip Speicher gibt es in Cuda 3 verschiedene Arten:
- Global, kann sowohl von der GPU als auch der CPU angefasst werden und ist somit die langsamste Variante. Ausserdem kommt hier noch der jeweilige Anschluss, also z.B. PCIe, als Bottleneck hinzu.
- Constant oder Texture, ist Read-Only Speicher und damit sehr speziell. Der einzige Vorteil gegenueber den globalen Speicher ist halt das man in der Regel weniger Bandbreite braucht.
- Local, wird von den Threads fuer automatische Array Variablen benutzt. Dabei handelt es sich aber lediglich um Spezielle Form von Globalen Speicher die nur geringfuegig schneller ist. Also auch wieder eher ne reine Optimierung statt echten Vorteil.

Beim On-Chip Speicher gibt es nun 2 verschiedene Arten unter Cuda:
- Register, speichern im Gegensatz zur CPU ALLE automatischen Variablen bis auf Arrays. Das ist aber eher ein Vorteil der durch die schon angesprochene Funktionale Architektur entsteht als ein tatsaechlicher Unterschied.
- Shared und L1-Cache, besitzen jeweils eine Bank pro Thread. Soweit ich weiss arbeitet Cuda hier mit 64kb Einheiten pro Block die in 16kb Schritten auf Shared oder L1 (16+48, 32+32 oder 48 + 16) Verteilt werden. Das Maximum liegt hier bei insgesamt 32 Baenken pro Warp, 512/32 pro Block (also 16 Warps) und 2 Blocks pro Grid aber keine Ahnung ob das irgendeine GPU ausreizt.

Alles in Allen ist eine GPU also genau das gleiche wie ein moderner Intel. Der einzige Unterschied ist halt du mehr Threads hast die auf weniger Speicher zugreifen und deine Variablen an sich in schnelleren Speicher landen.

_________________
Meine Homepage


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Spielerei mit Shader
BeitragVerfasst: Fr Aug 08, 2014 17:48 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1276
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Zitat:
Du musst hier zwischen Off- und On-Chip Speicher unterscheiden. Beim Off-Chip Speicher besteht im Prinzip kein Unterschied zur CPU. Sprich je nach Qualitaet der Ware bekommst du mal schnelleren oder langsameren Speicher. Der On-Chip Speicher ist hingegen der Grosse Unterschied im Vergleich zur CPU. Denn hier sind einfach mehr Baenke zur Verfuegung als auf der CPU und man ist somit schneller.

Ich dachte, das bisschen Quellcode ist im schnellen L1-Cache der CPU.

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Spielerei mit Shader
BeitragVerfasst: Sa Aug 09, 2014 11:22 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
@mathias: Auf Cache kannst du dich nicht mehr wirklich verlassen, sobald Multitasking im Spiel ist. Den teilst du dir ja mit anderen Programmen und dem Kernel.

Die Parallelität der GPU ist aber auf jeden Fall etwas, was so bei per-Pixel-Code extrem viel Performance rausholt. Einfach weil da zig Threads gleichzeitig dran rechnen, während auf der CPU bei naiver implementierung nur /ein/ Thread dran rechnet.

grüße
Horazont

_________________
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: Spielerei mit Shader
BeitragVerfasst: So Aug 10, 2014 00:52 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Nov 08, 2010 18:41
Beiträge: 769
Programmiersprache: Gestern
Gerade noch eine schöne Präsentation von Nvidia gefunden.
ftp://download.nvidia.com/developer/cud ... I_Arch.pdf

_________________
Meine Homepage


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 10 Beiträge ] 
Foren-Übersicht » Programmierung » Shader


Wer ist online?

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