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

Aktuelle Zeit: Do Mai 16, 2024 20:01

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



Ein neues Thema erstellen Auf das Thema antworten  [ 23 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: Frage zur nutzung von Shadern
BeitragVerfasst: So Jul 11, 2010 13:40 
Offline
DGL Member

Registriert: Do Jan 07, 2010 21:58
Beiträge: 240
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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Frage zur nutzung von Shadern
BeitragVerfasst: So Jul 11, 2010 14:39 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
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.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Frage zur nutzung von Shadern
BeitragVerfasst: So Jul 11, 2010 15:01 
Offline
DGL Member

Registriert: Do Jan 07, 2010 21:58
Beiträge: 240
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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Frage zur nutzung von Shadern
BeitragVerfasst: So Jul 11, 2010 16:05 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
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 ;)

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Frage zur nutzung von Shadern
BeitragVerfasst: So Jul 11, 2010 16:44 
Offline
DGL Member

Registriert: Do Jan 07, 2010 21:58
Beiträge: 240
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 :)


Zuletzt geändert von Dropye am So Jul 11, 2010 17:35, insgesamt 3-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Frage zur nutzung von Shadern
BeitragVerfasst: So Jul 11, 2010 16:53 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
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.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Frage zur nutzung von Shadern
BeitragVerfasst: So Jul 11, 2010 17:35 
Offline
DGL Member

Registriert: Do Jan 07, 2010 21:58
Beiträge: 240
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ß


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Frage zur nutzung von Shadern
BeitragVerfasst: So Jul 11, 2010 17:54 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
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.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Frage zur nutzung von Shadern
BeitragVerfasst: So Jul 11, 2010 18:21 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
F ist bei Delphi und Lazarus-Anhängern auch die Notation für eine Objekt/Klassenvariable.

greetings

_________________
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: Frage zur nutzung von Shadern
BeitragVerfasst: So Jul 11, 2010 18:23 
Offline
DGL Member

Registriert: Do Jan 07, 2010 21:58
Beiträge: 240
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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Frage zur nutzung von Shadern
BeitragVerfasst: So Jul 11, 2010 18:28 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
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 ;)

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Frage zur nutzung von Shadern
BeitragVerfasst: Mo Jul 12, 2010 09:44 
Offline
DGL Member

Registriert: Do Jan 07, 2010 21:58
Beiträge: 240
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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Frage zur nutzung von Shadern
BeitragVerfasst: Mo Jul 12, 2010 09:51 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Aug 18, 2007 18:47
Beiträge: 694
Wohnort: Köln
Programmiersprache: Java
Meinst du vielleicht gluUnProject?

_________________
Es werde Licht.
glEnable(GL_LIGHTING);
Und es ward Licht.


Zitat aus einem Java Buch: "C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do it blows your whole leg off"

on error goto next


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Frage zur nutzung von Shadern
BeitragVerfasst: Di Jul 13, 2010 12:21 
Offline
DGL Member

Registriert: Do Jan 07, 2010 21:58
Beiträge: 240
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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Frage zur nutzung von Shadern
BeitragVerfasst: Di Jul 13, 2010 12:23 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7804
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Das Gegenteil ist gluProject.

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 23 Beiträge ]  Gehe zu Seite 1, 2  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.027s | 17 Queries | GZIP : On ]