DGL
https://delphigl.com/forum/

Pixelweises Verschieben im Shader
https://delphigl.com/forum/viewtopic.php?f=20&t=10492
Seite 1 von 1

Autor:  Mortal-Shadow [ Mo Jul 02, 2012 20:57 ]
Betreff des Beitrags:  Pixelweises Verschieben im Shader

Hi,

Eventuell gehört dieser Thread auch ins Matheforum, war mir da nicht sicher.
Worum es mir geht, ist ein Text, der zwar an einer gewissen Position
in der Welt steht, dessen Größe jedoch unabhängig von der Kamera ist.

Was ich versucht habe:
Code:
  1.  
  2. attribute vec3 aVertexPosition;  //Position in WeltKoordinaten
  3. attribute vec2 aVertexOffset;    //"Fester" Abstand in x,y Richtung zu der Position
  4. attribute vec2 aTextureCoord;
  5.  
  6. uniform mat4 uMVMatrix;
  7. uniform mat4 uPMatrix;
  8.  
  9. varying vec2 vTextureCoord;
  10.  
  11. void main(void)
  12. {
  13.     gl_Position = uPMatrix * uMVMatrix * vec4(aVertexPosition, 1.0);
  14.     gl_Position = gl_Position + vec4(aVertexOffset, 0.0, 0.0)*gl_Position[2];
  15.     vTextureCoord = aTextureCoord;
  16. }

Was ich mir dabei gedacht habe:
Bei mir sind AspectRatio und FOVY konstant.
Bei Abstand z gilt, dass die Angezeigte Höhe h = 2*z*tan(FOVY/2).
Folglich linear in Abhängigkeit zur Distanz.

Was passiert:
Je näher ich heranzoome, desto kleiner wird mein Text auf dem Bildschirm.

Was mache ich falsch, bzw. wie mache ich es richtig?

Mfg.

Autor:  Coolcat [ Di Jul 03, 2012 16:50 ]
Betreff des Beitrags:  Re: Pixelweises Verschieben im Shader

Kurze Lösung:
Benutze gl_Position.w (bzw. [3]) statt gl_Position[2].

Mit Erklärung:
Das folgende ist deine Position in ND-Koordinaten, also dem Einheitswürfel von -1 bis 1.
Code:
  1. gl_Position = uPMatrix * uMVMatrix * vec4(aVertexPosition, 1.0);
  2. gl_Position /= gl_Position.w;

Dein aVertexOffset muss natürlich ebenfalls in ND-Koordinaten sein.
Statt nun gl_Position durch w zu teilen kannst du natürlich auch einfach aVertexOffset mit w multiplizieren. ;) Die Division wird später von der Grafikkarte erledigt.

Autor:  Mortal-Shadow [ Di Jul 03, 2012 18:33 ]
Betreff des Beitrags:  Re: Pixelweises Verschieben im Shader

Es klappt nun. :D
Danke!

Ich hatte das .w ignoriert, da ich nach folgendem Artikel:
http://en.wikipedia.org/wiki/Homogeneous_coordinates
gerechnet habe:
Punkt (x, y, z, w) homogen = (x/w,y/w,z/w) euklidisch.
Euklidisch ist es linear in der dritten Koordinate z/w => Wenn ich um a,b verschieben will:
(x/w,y/w,z/w) => (x/w+a*z/w, y/w+a*z/, z/w)
Entspricht homogen:
(x+a*z, y+b*z, z, w)
=> Wieder linear in z und unabhängig von w.

Warum genau die Rechnung nicht aufgeht, verstehe ich immer noch nicht so genau.

Autor:  Coolcat [ Di Jul 03, 2012 19:00 ]
Betreff des Beitrags:  Re: Pixelweises Verschieben im Shader

Zitat:
Warum genau die Rechnung nicht aufgeht, verstehe ich immer noch nicht so genau.

Die Rechnung ist schon richtig. Dein Denkfehler liegt aber darin das du ja gerade von der Tiefe (z) unabhängig sein willst. Also du brauchst (x/w+a, y/w+b, z/w) bzw. (x+a*w, y+b*w, z, w) :wink:

Autor:  Mortal-Shadow [ Di Jul 03, 2012 20:04 ]
Betreff des Beitrags:  Re: Pixelweises Verschieben im Shader

Danke nochmals.

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