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

Aktuelle Zeit: Sa Mai 18, 2024 15:55

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



Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Pixelweises Verschieben im Shader
BeitragVerfasst: Mo Jul 02, 2012 20:57 
Offline
DGL Member

Registriert: Mo Mai 25, 2009 21:29
Beiträge: 30
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.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Jul 03, 2012 16:50 
Offline
DGL Member
Benutzeravatar

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

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Jul 03, 2012 18:33 
Offline
DGL Member

Registriert: Mo Mai 25, 2009 21:29
Beiträge: 30
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.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Jul 03, 2012 19:00 
Offline
DGL Member
Benutzeravatar

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

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Jul 03, 2012 20:04 
Offline
DGL Member

Registriert: Mo Mai 25, 2009 21:29
Beiträge: 30
Danke nochmals.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Foren-Übersicht » Programmierung » Shader


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 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.007s | 14 Queries | GZIP : On ]