DGL
https://delphigl.com/forum/

Frage zur nutzung von Shadern
https://delphigl.com/forum/viewtopic.php?f=20&t=9327
Seite 1 von 2

Autor:  Dropye [ So Jul 11, 2010 13:40 ]
Betreff des Beitrags:  Frage zur nutzung von Shadern

Hallo,

Um mein Licht etwas "Leuchten" zu lassen habe ich mich für die Shader Variante im Radial Blur Shader entschieden (zu finden in der Shadersammlung)

nun habe ich mir das Tutorial zu Shadern und einige Forenbeiträge zu rate gezogen und bin soweit um den shader nutzen zu können

die Texte liegen jeweils in einer *.TXT

die werden dann in eine Stringlist eingelesen gebunden und kompiliert

Code:
procedure TLight.SetVertexShaderText;
var i1 : Integer;
var Source : String;
begin
  VertexShaderText.LoadFromFile('DATA\SHADER\Blur-Shader-Vertex.txt');
  Source := VertexShaderText.Text;
  i1 := Length(Source);
  glShaderSource(VertexShaderObject, 1, @Source, @i1);
  glCompileShader(VertexShaderObject);
  glAttachShader(ProgramObject, VertexShaderObject);
  glDeleteShader(VertexShaderObject);
end;

(das ganze nochmal als Fragmentshader)

dann fange ich an meine Szene zu Zeichnen


Code:
    glBindTexture(gl_Texture_2D, fTex);
    glTranslatef(fPosX,fPosY,fPosZ);
    glBlendFunc(GL_SRC_ALPHA, GL_SRC_COLOR);
    glEnable(GL_Blend);
    glColor4f(fColorR, fColorG, fColorB, fAlpha);
    gluSphere(fMesh, 10, 15, 13);
    FXBillBoardBegin;
      glBegin(GL_QUADS);
        glTexCoord2D(-1,-1);
        glVertex3f(fPosX-15,fPosY-15,fPosZ);
        glTexCoord2D(-1, 1);
        glVertex3f(fPosX-15,fPosY+15,fPosZ);
        glTexCoord2D( 1, 1);
        glVertex3f(fPosx+15,fPosY+15,fPosZ);
        glTexCoord2D( 1,-1);
        glVertex3f(fPosX+15,fPosY-15,fPosZ);
      glEnd;
    FXBillBoardEnd;


das ergibt eine Kugel und in der Kugel ist dann ein Quad welches immer in Kamerarichtung gedreht ist, als naächstes kopier ich das in eine eigene Textur, binde diese und nutze den shader

Code:
    glCopyTexSubImage2D(fBlurTex, 0, 20, 20, Round(fPosX-15), Round(fPosY+15), 30, 30);
    glBindTexture(gl_Texture_2D, fBlurTex);
    glUseProgram(ProgramObject);


anschließend wird das selbe quad welches ich oben schon genommen habe nochmal mit der neuen textur gezeichnet.

soweit so gut das macht er auch alles ohne zu mekern, nur seh ich dann gar nichts mehr wenn ich allerdings glUseProgram auskommentiere seh ich wieder alles, hab ich was vergessen?

danke schon im vorraus

Autor:  Coolcat [ So Jul 11, 2010 14:39 ]
Betreff des Beitrags:  Re: Frage zur nutzung von Shadern

Schau dir doch mal das Tutorial_GLSL an. Es ist z.B. ratsam nach dem compilieren und linken jeweils auf Fehler zu testen. In deinem Code sehe ich übrigens nirgendwo ein glLinkProgram. Auch musst du irgendwo die zahlreichen Uniform-Variablen des Shaders initialisieren.

Autor:  Dropye [ So Jul 11, 2010 15:01 ]
Betreff des Beitrags:  Re: Frage zur nutzung von Shadern

das glLinkprogramm wird an einer anderen stelle ausgeführt das hab ich vergessen mit zu erwähnen,

und mit den variablen dachte ich das reicht weil sie ja im shader drin stehen^^ mit dem tutorial hab ich gearbeitet bzw tu es aber ich find das echt komisch geschrieben

ich hab die fehlerfunction mal eingebaut und sie gibt mir nichts zurück, was darauf schließen lässt das alles einwandfrei funktioniert

Autor:  Coolcat [ So Jul 11, 2010 16:05 ]
Betreff des Beitrags:  Re: Frage zur nutzung von Shadern

Zitat:
und mit den variablen dachte ich das reicht weil sie ja im shader drin stehen^^

Ja, nee...der Sinn von Uniforms ist ja gerade das man sie von außerhalb setzen kann (und muss). Wenn man Werte im Shader festlegen will kann man auch eine Konstante nehmen ;)

Autor:  Dropye [ So Jul 11, 2010 16:44 ]
Betreff des Beitrags:  Re: Frage zur nutzung von Shadern

ok also hab ich mich wieder an das tut gewendet und das war der meinung um variablen zu setzen sollte ich "glUniform" verwenden

das habe ich gemacht, nun sieht das ganze so aus

Code:
  glLinkProgram(ProgramObject);
  glUseProgram(ProgramObject);
  glUniform1f(glGetUniformLocation(ProgramObject,'radial_blur'), 3.0);
  glUniform1f(glGetUniformLocation(ProgramObject,'radial_bright'), 2.0);
  glUniform2f(glGetUniformLocation(ProgramObject,'radial_origin'), fPosX, fPosY);
  glUniform2f(glGetUniformLocation(ProgramObject,'radial_size'), 20.0,20.0);


und in jedem frame einzeln

Code:
    glCopyTexSubImage2D(fBlurTex, 0, 20, 20, Round(fPosX-15), Round(fPosY+15), 30, 30);
    glBindTexture(gl_Texture_2D, fBlurTex);
    glUniform1f(glGetUniformLocation(ProgramObject,'Texture'), fBlurTex);
    glUseProgram(ProgramObject);


nun habe ich schonmal ein weißes rechteck :)

Autor:  Coolcat [ So Jul 11, 2010 16:53 ]
Betreff des Beitrags:  Re: Frage zur nutzung von Shadern

Die Textur für den Shader sollte nur ein Integer sein, und zwar die Nummer der Texturunit auf der du die Textur gebunden hast. Das dürfte bei dir einfach "0" sein, also ca. so:
glUniform1i(glGetUniformLocation(ProgramObject, PGLCharARB('Texture')), 0);

Für die anderen Uniforms musst du ebenfalls erstmal mit glGetUniformLocation den Namen der Uniform in eine Location umsetzen. Das geht erst nach Aufruf von glLinkProgram, da dort nämlich genau diese Locations festgelegt werden.

Edit: Ah...du hast nochmal editiert...jetzt ist das glGetUniformLocation drin ;) Aber die Textur muss 0 sein...und ein Integer.

Autor:  Dropye [ So Jul 11, 2010 17:35 ]
Betreff des Beitrags:  Re: Frage zur nutzung von Shadern

mir is die idee gekommen das ich die Textur die ich an den shader übergebe natürlich auch wieder auslesen muss

also ich wieder im wiki am stöbern, und finde glGetUniform

Code:
glGetUniformfv(ProgramObject, glGetUniformLocation(ProgramObject,'Texture'), fBlurTex);


aber nun sagt er das Cardinal und PGLInt Inkompatibel sind

konnte die sache umgehen indem ich statt fBlurTex wieder 0 angegeben habe, wenn ich nun aber 0 binde seh ich immernoch nur weiß

Autor:  Coolcat [ So Jul 11, 2010 17:54 ]
Betreff des Beitrags:  Re: Frage zur nutzung von Shadern

Zitat:
mir is die idee gekommen das ich die Textur die ich an den shader übergebe natürlich auch wieder auslesen muss

Ähm, nein da bist du auf dem Holzweg. Der Shader rendert ganz normal in den Framebuffer.

Code:
// Textur an Stage 0 binden
glActiveTexture(GL_TEXTURE0); // GL_TEXTURE0 ist das Default-Setting, kannst du also weglassen wenn du kein Multitextuing nutzt
glBindTexture(gl_Texture_2D, fBlurTex);

// Shader auf Stage 0 zugreifen lassen
glUniform1i(glGetUniformLocation(ProgramObject, PGLCharARB('Texture')), 0);


Beachte das ist glUniform1i und nicht glUniform1f.
Wieso heißt die Variable eigentlich fBlurTex? Das kleine f suggeriert das es sich um die sogenannte ungarische Notation für Variablennamen handelt und die Variable vom Typ float ist. Es sollte aber ein GLuint sein, also z.B. uiBlurTex.

Autor:  Lord Horazont [ So Jul 11, 2010 18:21 ]
Betreff des Beitrags:  Re: Frage zur nutzung von Shadern

F ist bei Delphi und Lazarus-Anhängern auch die Notation für eine Objekt/Klassenvariable.

greetings

Autor:  Dropye [ So Jul 11, 2010 18:23 ]
Betreff des Beitrags:  Re: Frage zur nutzung von Shadern

Zitat:
Wieso heißt die Variable eigentlich fBlurTex? Das kleine f suggeriert das es sich um die sogenannte ungarische Notation für Variablennamen handelt und die Variable vom Typ float ist. Es sollte aber ein GLuint sein, also z.B. uiBlurTex.


das f nutze ich um privaten von public variablen zu unterscheiden

das mit der textur werd ich so probieren

Autor:  Coolcat [ So Jul 11, 2010 18:28 ]
Betreff des Beitrags:  Re: Frage zur nutzung von Shadern

Zitat:
das f nutze ich um privaten von public variablen zu unterscheiden

Weil weder in public noch in private ein "f" vorkommt? Naja, jedem das seine, ich bin ja auch mehr der C++-Mensch ;)

Autor:  Dropye [ Mo Jul 12, 2010 09:44 ]
Betreff des Beitrags:  Re: Frage zur nutzung von Shadern

Zitat:
Weil weder in public noch in private ein "f" vorkommt?


ich weiß nich wer sich das ausgedacht hat aber dort wo ich mir die klassenstruktur und schreibweise abgeguggt habe war das nunmal so gelößt,

ich hab festgestellt das ich nun noch berechnen muss wo sich meine lampe auf dem bildschirm befindet weil ich ja nich den ganzen viewport verwischen will sondern nur ein kleines viereck
aber ich hab schonmal sowas gelesen von einer funktion die aus 3d koords 2d berechnet, die muss ich mir nur raussuchen dann meld ich mich wieder

Autor:  damadmax [ Mo Jul 12, 2010 09:51 ]
Betreff des Beitrags:  Re: Frage zur nutzung von Shadern

Meinst du vielleicht gluUnProject?

Autor:  Dropye [ Di Jul 13, 2010 12:21 ]
Betreff des Beitrags:  Re: Frage zur nutzung von Shadern

ich glaube die funktion die du gepostet hast macht genau das was ich brauch nur falschherum, ich kenne ja meine objectkoordinaten, ich brauch sie aber als 2D X,Y Pixel-koordinaten

Autor:  Flash [ Di Jul 13, 2010 12:23 ]
Betreff des Beitrags:  Re: Frage zur nutzung von Shadern

Das Gegenteil ist gluProject.

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