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

Aktuelle Zeit: Mi Mai 15, 2024 08:42

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



Ein neues Thema erstellen Auf das Thema antworten  [ 16 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: Shadowmap und Shader
BeitragVerfasst: Mo Feb 02, 2009 17:22 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Sep 19, 2007 21:36
Beiträge: 46
Hi

ich bin noch blutiger Anfänger in Sachen Shader. Hab gestern angefangen und auch schon ein bissl was hinbekomm.

Jetz wollte ich Shader in mein aktuelles Progrekt einbinden und dabei ist folgendes Problem aufgetreten:

In meinem Projekt verwende ich Shadowmapping für den Schatten.
Wenn ich jetzt allerdings per Multitexturing im Shader wieder meine Texturen und die Schattentextur ausgeben will, wird die Schattentextur nicht über die ganze Szene gerendert sondern auf jede einzelne Primitive, wie ne normale textur eben.

Muss ich die Änderung in der Texturmatrix an den Shader übergeben? und wenn ja wie?

mfg Strecker


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Feb 02, 2009 21:09 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Deine Texturkoordinaten liest du (im Vertex Shader) sicherlich mit:
Code:
  1.  
  2.   gl_TexCoord[x] = gl_MultiTexCoordx;
  3.  

aus.

Dem musst du jetzt nurnoch sagen, dass er auch mit der Matrix multiplizieren soll:
Code:
  1.  
  2.   gl_TexCoord[x] = gl_TextureMatrix[x] * gl_MultiTexCoordx;
  3.  


Und das sollte dein Problem auch schon lösen :)

(x natürlich mit dem Index der entsprechenden Texturunit ersetzen - ich empfehle, das übrigens nur auf die Texturunit anzuwenden, wo du es brauchst.)

Gruß Lord 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:
BeitragVerfasst: Mo Feb 02, 2009 22:23 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Sep 19, 2007 21:36
Beiträge: 46
ok danke erstmal.
ich hab es mal so ausprobiert. jetzt sieht es zwar anders aus aber iwie immer noch falsch.
könnte das mit der autom. texturkoordinatengenerierung (gl_TexGen) zusammenhängen?
wie könnte man dieses problem lösen, dass quasi auch im shader die texturkoordinaten korrekt generiert werden?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Feb 04, 2009 17:43 
Offline
DGL Member

Registriert: Fr Okt 03, 2008 13:32
Beiträge: 367
Also wenn die Shadowmap zB die Silhouette eines Baums darstellt würde ich für jeden Pixel im Fragmentshader über eine Projektion den entsprechenden Punkt auf der Map ausrechen.

Das geht wohl mit "texture2DProj". Kannst mal bei http://wiki.delphigl.com/index.php/Tutorial_Wassereffekt schauen, ob du das was verwenden kannst.
So richtig blick' ich das allerdings auch nicht wie das funktioniert, mit dem Matrizen und so.

Die andere Möglichkeit, die für mich intuitiver ist, wäre das per Hand auszurechnen:
Also die Vertexposition mit der Modelviewmatrix aus dem Vertexshader an den Fragmentshader weiterreichen. Die Richtung der Lichtquelle, wenn es die Sonne ist, als uniform-Variable übergeben, ansonsten die Position. Und mit der Matrix deiner Kamera multiplizieren (Richtungsvektoren natürlich nur drehen und nicht verschieben). Wenn man sich dann den Baum als Fläche im Raum vorstellt, kann man aus der Gerade von der Vertexposition in Richtung Lichtquelle und der Baum-Ebene den Schnittpunkt mit der Ebene errechnen. Dann kann man aus dem Ursprung der Baum-Ebene und den beiden Richtungsvektoren, die die Ebene aufspannen, die Koeffizienten für die Vektoren bestimmen damit der Schnittpunkt rauskommt. Und die Koeffizienten wären dann die Koordinaten für die Textur.

Ist bestimmt nicht die schnellste Variante, aber wie gesagt, das andere Versteh ich auch nicht so wirklich, und wenn hier sonst keiner mehr antwortet, hilft es dir vllt wenigstens ein bischen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Feb 05, 2009 17:53 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Sep 19, 2007 21:36
Beiträge: 46
hmmm.. aba soweit ich weis ist die Textur ja schon durch den Fragmentvergleich "gelaufen" und ist schon an den richtigen Stellen hell bzw. dunkel und muss jetzt nurnoch mit der richtigen skalierung und position etc. über die Szene gelegt werden.
Das hat vorher (ohne Shader) glTexGen übernommen (und die Änderung der Texturenmatrix) ... wenn ich jetz die Textur an den Shader übergebe, wird alles was in glTexGen gemacht wird, nicht übermittelt.
Also hab ich versucht das im Shader nachzubauen aber es kommt immer nur Müll raus.

Weis jemand wie ich das im Shader nachbauen kann:

Code:
  1.  
  2.  const
  3.       x : array[0..3] of Single = (1, 0, 0, 0);
  4.       y : array[0..3] of Single = (0, 1, 0, 0);
  5.       z : array[0..3] of Single = (0, 0, 1, 0);
  6.       w : array[0..3] of Single = (0, 0, 0, 1);
  7.  
  8.   ...
  9.  
  10.  glTexGenfv(GL_S, GL_EYE_PLANE, @x);
  11.  glTexGenfv(GL_T, GL_EYE_PLANE, @y);
  12.  glTexGenfv(GL_R, GL_EYE_PLANE, @z);
  13.  glTexGenfv(GL_Q, GL_EYE_PLANE, @w);
  14.  
  15.  glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
  16.  glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
  17.  glTexGeni(GL_R, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
  18.  glTexGeni(GL_Q, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
  19.  
  20.  




Vielleicht kennt ja auch jemand eine bessere Methode Schatten zu erzeugen .. vielleicht eine die nur über den Shader funktioniert?[/pascal]


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Feb 05, 2009 18:51 
Offline
DGL Member

Registriert: Fr Okt 03, 2008 13:32
Beiträge: 367
Also eigentlich müssten die Texturkoordinaten ja egal ob Shader oder nicht gleich sein, weil das denke ich nur ein automatisierter Aufruf von glTexCoord ist.
Das heißt, das was Lord Horazont vorgeschlagen hat, würde schon reichen.
Vielleicht kannst du mal noch dem Shader (Vertex und Fragment) posten.

Wenn man mit dem Shader einfach die Fixed Functionpipeline nachbauen würde, dürfte es keinen Unterschied machen, ob der Shader an oder aus ist. Also kann es gut sein, dass der Fehler im Shader liegt.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Feb 05, 2009 20:29 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Sep 19, 2007 21:36
Beiträge: 46
okay .. also hier sind die shader (aufs nötigste minimiert)
Texture1 ist die Schattentextur.

Vertex Shader:

Code:
  1.  
  2. void main(void)
  3. {
  4.   gl_TexCoord[0]  = gl_MultiTexCoord0;
  5.   gl_TexCoord[1]  = gl_MultiTexCoord1 * gl_TextureMatrix[1];
  6. }
  7.  


Fragment Shader:

Code:
  1.  
  2. uniform sampler2D Texture0;
  3. uniform sampler2D Texture1;
  4.  
  5. void main(void)
  6. {
  7.  
  8.  gl_FragColor = texture2D(Texture0, vec2(gl_TexCoord[0])) * texture2D(Texture1, vec2(gl_TexCoord[1]));
  9. }
  10.  


Im Programm passiert folgendes:

Code:
  1.  
  2.  glActiveTexture(GL_TEXTURE1);
  3.  
  4.  glEnable(GL_TEXTURE_GEN_S);
  5.  glEnable(GL_TEXTURE_GEN_T);
  6.  glEnable(GL_TEXTURE_GEN_R);
  7.  glEnable(GL_TEXTURE_GEN_Q);
  8.  
  9.  glTexGenfv(GL_S, GL_EYE_PLANE, @x);
  10.  glTexGenfv(GL_T, GL_EYE_PLANE, @y);
  11.  glTexGenfv(GL_R, GL_EYE_PLANE, @z);
  12.  glTexGenfv(GL_Q, GL_EYE_PLANE, @w);
  13.  
  14.  glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
  15.  glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
  16.  glTexGeni(GL_R, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
  17.  glTexGeni(GL_Q, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
  18.  
  19.  
  20.  glMatrixMode(gl_Texture);
  21.  glLoadIdentity;
  22.  
  23.  
  24.   glTranslatef(0.5, 0.5, 0.5);
  25.  
  26.   glScalef(0.5, 0.5, 0.5);
  27.  
  28.   gluPerspective(45, form1.ClientWidth/form1.ClientHeight, 10, 1000);
  29.  
  30.   gluLookAt(eye[0],eye[1],eye[2], center[0],center[1],center[2],0,1,0);
  31.  
  32.  
  33.    glUseProgramObjectARB(GlobalShaderObj);
  34.    glUniform1iARB(glGetUniformLocationARB(GlobalShaderObj, PGLCharARB('Texture0')), 0) ;
  35.    glUniform1iARB(glGetUniformLocationARB(GlobalShaderObj, PGLCharARB('Texture1')), 1) ;
  36.  
  37.   renderScene;
  38.  
  39.  



Ohne Shader wird die Shadowmap wunderbar ausgegeben .. mit Shader kommt nur Müll ..

wäre überdankbar^^ wenn jemand mir sagen könnte was ich falsch mache

mfg


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Feb 05, 2009 20:50 
Offline
DGL Member
Benutzeravatar

Registriert: Di Jul 29, 2003 00:11
Beiträge: 436
Ich hab noch nie Shader wirklich angefasst, aber müsste
Code:
  1.  
  2.  
  3.   gl_TexCoord[0]  = gl_MultiTexCoord0;
  4.   gl_TexCoord[1]  = gl_MultiTexCoord1 * gl_TextureMatrix[1];
  5.  

nicht
Code:
  1.  
  2.   gl_TexCoord[0]  = gl_MultiTexCoord0 * gl_TextureMatrix[0];
  3.   gl_TexCoord[1]  = gl_MultiTexCoord1 * gl_TextureMatrix[1];
  4.  

heißen?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Feb 05, 2009 21:05 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Sep 19, 2007 21:36
Beiträge: 46
naja das ist ja in diesem fall egal weil die Texturenmatrix der ersten Textureneinheit nicht verändert wird .. mir gehts ja um die Schattentextur und deren Matrix und alles


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Feb 05, 2009 21:57 
Offline
DGL Member

Registriert: Fr Okt 03, 2008 13:32
Beiträge: 367
Vertausch mal "gl_MultiTexCoord1" und "gl_TextureMatrix[1]" im Vertexshader.
Matrizenmultiplikationen sind nicht kommutativ.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Feb 07, 2009 13:30 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Sep 19, 2007 21:36
Beiträge: 46
wenn ichs vertausche kommt garnichts mehr .. also als wäre dir schattentextur komplett weis


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Feb 07, 2009 18:14 
Offline
DGL Member

Registriert: Fr Okt 03, 2008 13:32
Beiträge: 367
Hm, das ist allerdings nicht so gut. Ich denke aber so wäre es richtig, die Vertexposition wird ja auch mit der Matrix an erster Stelle multpliziert.
Kannst ja mal die Texturkoordinaten überprüfen und mit den Sollwerten vergleichen. Richtig gut geht das natürlich nicht, aber wenn man mit "gl_FragColor = gl_TexCoord[1]" die Farbe verändert kann man vllt schon etwas erkennen.
Es kann aber auch sein das "texture2D" bei deinen Texturkoordinaten nicht funktioniert, weil sie vielleicht 3-dimensional sind. Also nicht nur X und Y-Wert bestimmend sind sondern auch Z. Keine Ahnung was bei der automatischen Generierung wirklich erzeugt wird. In dem Fall müsste man dann wohl "texture2DProj" verwenden, aber wie oben schon gesagt, kann ich die Funktionsweise auch nicht so richtig nachvollziehen, also ist das mehr geraten.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Feb 07, 2009 19:32 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Sep 19, 2007 21:36
Beiträge: 46
okay danke erstmal .. ich bin meiner Problemlösung schon ein stückchen näher gekommen .. und zwar muss der Z-Vergleich im Shader gemacht werden (und evtl. die Texturkoordinatengenerierung auch) .. nur habe ich wiedermal keine Ahung wie .. vielleicht hat sie jmd anderes?

mfg


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Feb 07, 2009 19:55 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Dafür gibt es in GLSL doch spezielle Sampler :
Code:
  1. Im FS :
  2. vec4 shadow1D (sampler1DShadow sampler, vec3 coord [, float bias])
  3. vec4 shadow2D (sampler2DShadow sampler, vec3 coord [, float bias])
  4. vec4 shadow1DProj (sampler1DShadow sampler, vec4 coord [, float bias])
  5. vec4 shadow2DProj (sampler2DShadow sampler, vec4 coord [, float bias])
  6.  
  7. Im VS :
  8. vec4 shadow1DLod (sampler1DShadow sampler, vec3 coord, float lod)
  9. vec4 shadow2DLod (sampler2DShadow sampler, vec3 coord, float lod)
  10. vec4 shadow1DProjLod (sampler1DShadow sampler, vec4 coord, float lod)
  11. vec4 shadow2DProjLod (sampler2DShadow sampler, vec4 coord, float lod)
  12.  


Die nehmen dir quasi die ganze Arbeit der Projektion und des Tiefenvergleichs ab, du musst sowas also nicht komplett im Shader nachbauen.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Feb 07, 2009 20:12 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Sep 19, 2007 21:36
Beiträge: 46
okay .. ich denke ich habe jetzt genug anhaltspunkte um das selber hinzubekommen .. solbald ichs habe (oder wenn ich am verzweifeln bin^^) schreib ich nochmal

mfg


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 16 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Foren-Übersicht » Programmierung » Shader


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 5 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.037s | 17 Queries | GZIP : On ]