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 ![]() |
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/ |