DGL
https://delphigl.com/forum/

Rückgabewerte bei Shadern ?
https://delphigl.com/forum/viewtopic.php?f=20&t=4436
Seite 1 von 1

Autor:  Seppel [ Mo Aug 15, 2005 11:56 ]
Betreff des Beitrags:  Rückgabewerte bei Shadern ?

Hallo,

zunächst muss ich sagen, dass ich hier recht neu bin und mich bislang nur auf`s lesen und stöbern beschränkt habe. ;)
Nun ist es aber so, dass ich im Rahmen meiner Diplomarbeit mehr oder weniger mit Shadern zu tun habe.
Ohne an dieser Stelle zuweit auszuholen, stelle ich einfach mal meine Frage:

Über Uniform und Attribute kann man ja ohne große Probleme Werte an Shader übergeben. Mich würde nun interessieren ob dieses auch umgekehrt machbar ist. Also das man Werte auch aus den Shadern auslesen kann und sich seperat ausgeben lassen kann. Zwar nutze ich zur Programmierung C++ allerdings betrifft die Problematik wohl eher GLSL denke ich.

Wäre echt super wenn ihr mir ein wenig weiterhelfen könntet, da mir ehrlich gesagt Google nicht die erhofften Ergebnisse ausgespuckt hat ! ;)

Mfg

Sebastian

Autor:  logout [ Di Aug 16, 2005 10:59 ]
Betreff des Beitrags: 

Meine Karte unterstützt kein glSlang so das ich das nicht testen kann, aber versuchs mal mit glGetUniform. Entweder du kannst über den Shader den Wert setzen, oder du erhälst nur das praktisch zurück, was du mit glUniform an den Shader übergeben hast.

Autor:  Lossy eX [ Di Aug 16, 2005 11:31 ]
Betreff des Beitrags: 

Ich bin zwar nicht der Shaderkrack hier ab Board aber anscheinend sind die Tastaturen der Anderen kaputt. ;-)

Shader sind normal nicht dafür gedacht einzellne Wert zu berechnen. Sie werden automatisch von der Grafikkarte aufgerufen. Und dann auch nicht nur ein mal sondern verschieden oft. Je nachdem wie viele Koordinaten oder Pixel berechnet werden müssen. Aber normal ist ein Shader nicht dafür gedacht die Ergebnisse wieder auslesen zu können. Je nach Anwendungsfall gibt es zwar verschieden Möglichkeiten dort etwas hinzutricksen. Aber ob das immer so sinnvoll ist sei einmal dahin gestellt.

Schau dir mal diese Thema an. Wenn dir das nicht hilft oder du etwas ganz anderen machen willst dann solltest du evtl genau werden. Also was du vor hast etc.

Autor:  La Boda [ Di Aug 16, 2005 12:04 ]
Betreff des Beitrags: 

Also mit glGetUniform geht das schon, ohne recht viel zu tricksen.
Ich hab mal den Eintrag im Wiki vervollständigt: http://wiki.delphigl.com/index.php/GlGetUniform

Autor:  Seppel [ Di Aug 16, 2005 14:29 ]
Betreff des Beitrags: 

Hallo,

zunächst einmal danke für die Antworten.
Vielleicht erkläre ich erst einmal was ich bzw. mein Professor und ich im Groben vorhaben.
Es soll eine Möglichkeit geschaffen werden diverse Matheaufgabe (Vektoren- & Matrixenrechnungen, etc.) zunächst versuchsweise von Shadern lösen zu lassen. Dazu muss ich aber zum einen Werte an einen Shader übergeben können, mir anschliessend errechnete Werte auch wieder ausgeben lassen können um diese dann anzeigen zu lassen (cout oder printf).

Nun 2 Anmerkungen zu den hier gebrachten Vorschlägen:

(1) Ich dachte bislang immer, dass Uniform-Variablen "Read-Only" sind für einen Shader oder kann dieser den Wert auch selbst ändern ?

(2) Ich habe das mit glGetUniform versucht, aber ich bekommen immer eine Fehlermeldung. Vielleicht beschreibe ich mal kurz was ich gemacht habe

Im Shader (der heisst im program einfach nur v für Vertexshader)
-------------
uniform float a;


Im Programm
-----------------
GLint location;
GLfloat wert;
...
location = glGetuniformLocationARB(v, "a");
....
glUniform1fARB(location, 2.5); --> Einfach willkürlich einen Wert gegeben
....
....
glGetUniformfv(v, loc, wert);


Mmh, ich denke mal das ich die Syntax bzw. die Funktion von glGetUniform noch nicht so recht verstanden habe, nur leider findet man nicht viele Informationen hierzu. Ich hoffe hier kann mir das jemand erklären. Wäre echt super...

Mfg

Sebastian

Autor:  Seppel [ Do Aug 18, 2005 10:18 ]
Betreff des Beitrags: 

Kann mir denn wirklich keiner ein kleines bisschen weiterhelfen oder einen Tipp geben ? :roll:

Autor:  Lossy eX [ Do Aug 18, 2005 11:06 ]
Betreff des Beitrags: 

glGetUniform möchte gernen einen Pointer. Du musst ihm dann natürlich auch einen Pointer übergeben.

Also entsprechend so.
Code:
  1. glGetUniformfv(v, loc, @wert);

Allerdings wundert es mich, dass dein Compiler dazu nichts sagt. Falls du es bei dir im Programm doch so hast er aber dennoch nichts sinnvolles tut kann ich dir nur empfehlen mal abzufragen ob Fehler aufgetreten sind und wenn dann was für welche.

Code:
  1. var
  2.   Error: Cardinal;
  3. begin
  4.   // Render
  5.  
  6.   Error := glGetError;
  7.   if Error <> 0 then
  8.     ShowMessage(gluErrorString(Error));
  9.  
  10.   SwapBuffers (FDC);
  11. end;

Wenn notwendig solltest du die Fehler auch häufiger abfragen. Also wenn ein Fehler aufgetreten ist und du ihn nicht finden kannst.

Autor:  Seppel [ Fr Aug 19, 2005 17:26 ]
Betreff des Beitrags: 

Mmh, ich muss mir das wohl nochmal in Ruhe ansehen. Vielleicht bekomme ich es dann ja hin. ;)

Aber mal grundsätzlich eine andere Frage: Sind Uniform und Attribute-Variablen nicht "Read-Only" oder kann der Shader auch die Werte dieser Variablen ändern ? Weil wenn nicht dann macht das ganze Vorhaben so keinen Sinn...

Mfg & Schönes Wochenende

Sebastian

Autor:  Seppel [ Mo Aug 22, 2005 10:09 ]
Betreff des Beitrags: 

So, ich habe heute nochmal was anderes ausprobiert und es in der Tat so, dass die Uniform-Variablen nicht von Shader verändert werden können. Somit ist das mit dem GetUniform auch uninteressant, da ich ja nur die Werte auslesen könnte, die ich dem Shader eh schon übergeben habe. ;)

Gibt es denn vieleicht noch eine andere Möglichkeit Werte von Shadern berechnen zu lassen und diese dann wieder auszulesen, so dass ich diese z.B. in Visual Studio ausgeben kann ?

Mfg

Sebastian

Autor:  luketheduke [ Mo Aug 22, 2005 12:37 ]
Betreff des Beitrags: 

Was ist der zweck des shaders? Bilder zu verändern.

Ergo: Du kannst Informationen in die erzeugten Bilder abspeichern. wenn du trotzdem noch ansehnliche Bilder willst, kannst du ja mit Steganografie arbeiten ;)

Autor:  La Boda [ Mo Aug 22, 2005 13:32 ]
Betreff des Beitrags: 

lukes Idee ist wirklich nicht schlecht. Das Problem ist bei Shadern halt, dass sie unheimlich oft ausgeführt werden, und im Normalgebrauch, als im Grafikdesign also auch sehr viele verschiedene Ergebnisse liefern. Da ist natürlich eine Zahlenausgabe nicht sehr sinnvoll.
Ich habe aber trotzdem düster eine Funktion zur Ausgabe von Shader-Werten in Erinnerung, aber mir fällt partout nicht ein, wie sie heisst und wo ich das gelesen hab. Suche schon ein paar Tage danach... :?

Autor:  Seppel [ Mo Aug 22, 2005 13:52 ]
Betreff des Beitrags: 

Ja, die Sache ist halt die, dass die Shader mehr oder weniger zum reinen Rechnen missbraucht werden sollen. Also Eingangswerte an Shader schicken und dann die Ergebnisse ausgeben lassen. Der Gedanke, der dahinter steckt ist, dass man sich erhofft kürzere Rechenzeiten zu erzielen als bisher. Wenn man zum Beispiel Fourier-Analysen oder Strömungssimulationen durchrechnen möchte.

Das das mit dem "in Bildern abspeichern" hatte ich mir mit meinem Professor auch schon überlegt, aber wie soll das denn dann ablaufen ?

Autor:  LarsMiddendorf [ Mo Aug 22, 2005 14:09 ]
Betreff des Beitrags: 

Die Ausgabe der Shader wird je nach Einstellung auf den Bildschirm oder in einen PBuffer oder in eine Texture geschrieben. Man kann bis zu 16 single Werte pro Pixel ausgeben, die normalerweise als Farben dargestellt werden, und mittels glReadPixels oder glGetTexImage wieder zurücklesen. Das lohnt sich aber nicht für einzelne Pixel sondern nur für viele Werte die dann parallel berechnet wurden. Man packt also seine Eingabedaten in Texturen und zeichnet dann ein bildschirmfüllendes Quadrat. Für jeden Pixel wird der Shader einmal aufgerufen und kann dann an diesem Pixel seine bis zu 16 Werte berechnen und nacher kann man die Ergebnisse dann auslesen. Die Aufrufe der Shader Programme sind unabhängig. Falls man also Daten zwischen Rechenschritten austauschen möchte muß man dann die Ergebnisse in einer Texture speichern und dann den nächsten Teil der Berechnung durchführen. Damit kann man viele numerische Algorithmen berechnen wie z.B. große System von Differentialgleichungen lösen u.Ä. Aber das funktioniert immer nur mit großen Datenmengen die parallel verarbeitet werden können, denn das ist die Stärke der Grafikkarten.


Weitere Informationen:
http://www.gpgpu.org/developer/

Autor:  luketheduke [ Mo Aug 22, 2005 22:00 ]
Betreff des Beitrags: 

Ach so siehts aus, Seppel! Na sag das doch gleich! Such mal nach "AES" hier im Forum, da solltest du was ganz finden, das genau deinem letzten Post entspricht.

Das Missbrauchen des Pixelshaders scheint in Mode zu kommen :mrgreen: . ich glaube auch mich daran zu erinnern, dass jemand schon einmal etwas Audio-bezogenes (frag mich nicht, was genau) im Shader berechnet hat.

PS: wie wärs mit einem neuen Wiki-Artikel: "Wie missbrauche ich die Shaderunit als zweite CPU?" :mrgreen:

EDIT: was heisst hier suchen - drück einfach backspace und wähl den fünften topic, "AES in Pixelshader" :roll:

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