Du bist nicht angemeldet.

Werbeanzeige

Schrompf

Alter Hase

Beiträge: 1 415

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

11

30.09.2014, 14:08

Auch nicht schlecht ... du rechnest also deine Geometrie um auf [(-x/2 ; y/2) (x/2 ; -Y2)] mit x=ScreenWidth und y=ScreenHeight,
führst anschließend die Rotation durch und rechnest das Ergebnis wieder um auf [(-1 ; 1) (1; -1)] ?

Richtig ?


Nein. Meine Geometrie ist von vornherein in Pixelkoordinaten. Benutzt wird Instancing. Rein gehen:

Pro Vertex:
- nur X,Y mit jeweils +-1
Pro Instanz:
- Griffpunkt in Bildschirmkoordinaten: X, Y
- Tiefe für optionale ZBuffer-Nutzung: Z von 0 bis 1
- Griffpunktposition: X und Y von 0 (links oben) bis 1 (rechts unten)
- Rotation: Winkel
- Darstellungsgröße in Pixeln: Breite, Höhe
- Farbe: R, G, B, A
- Grafikbereich vom Texturatlas in Pixeln: x, y, Breite, Höhe

Der VertexShader berechnet aus dem Winkel eine 2x2-Rotationsmatrix, errechnet daraus die Basisvektoren in X- und Y-Richtung, multipliziert die mit der Darstellungsgröße und addiert dann alles zusammen, um die finale Vertexposition zu bekommen. Aus dem Grafikbereich werden die Texturkoordinaten und die Koordinatengrenzen für die Fehlpixelverhinderung berechnet. Und das alles geht dann in den Pixelshader, der nicht viel mehr macht als Textur sampeln, Färbung anwenden und Premultiplied Alpha. Mit einer winzigen Portion zusätzlicher Mathe habe ich dort außerdem eingebaut, dass negative Alphawerte als additives Alphablending umgesetzt werden, positive Alphawerte sind interpolierendes Alphablending wie gewohnt.

VertexShader-Code:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
$rein float2 vertexPos;
$rein float3 instZielPos;
$rein float2 instGroesse;
$rein float4 instGrafik;
$rein float4 instFarbe;
$rein float2 instParam;

$raus float4 fragPos;
$raus float4 fragFarbe;
$raus float2 fragTex;
$raus float4 fragTexGrenz;

float2 gQuellGroesse;
float2 gZielGroesse;

$main()
{
  float2 sinUndCos;
  sincos( instParam.x, sinUndCos.x, sinUndCos.y);

  float2 vx = float2( 1.0f, 1.0f) * sinUndCos.yx;
  float2 vy = float2( -1.0f, 1.0f) * sinUndCos.xy;

  float2 quadPos = (vertexPos.xy - instParam.yy) * instGroesse.xy;
  float2 vpos = instZielPos.xy + quadPos.x * vx + quadPos.y * vy;
#if GRAFIK_DIRECTX == 9
  // mit halbem Pixel Offset nach links oben für DX9-Rasterizing Rules
  vpos += float2( -0.5f, 0.5f);
#endif

  fragPos = float4( vpos.xy * gZielGroesse.xy * float2( 2.0f, -2.0f) + float2( -1.0f, 1.0f), instZielPos.z, 1.0f);

  ... und so weiter ...
}


Sieht für Dich etwas skurril aus, vermute ich. Das ist Quelltext für meinen Shader-Crosscompiler, um DX9, DX11 und OpenGL abdecken zu können.
[edit] Immer wieder gut, seinen Kram mal öffentlich zu machen. So ist mir hier aufgefallen, dass das Direct3D-Offset für pixelexaktes Rendern nach links unten ging, nicht nach links oben, wie es sein müsste. Nuja, ich bin halt immernoch beim großen Umschreiben.
Häuptling von Dreamworlds. Baut aktuell an nichts konkretem, weil das Vollzeitangestelltenverhältnis ihn fest im Griff hat. Baut daneben nur noch sehr selten an der Open Asset Import Library mit.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Schrompf« (30.09.2014, 14:14)


stef

Treue Seele

  • »stef« ist der Autor dieses Themas

Beiträge: 241

Wohnort: Kassel

Beruf: Softwareentwickler

  • Private Nachricht senden

12

30.09.2014, 14:53

@Schrompf: Vielen Dank für deine Mühe ... ist aber glaube ich etwas hoch für mich.

Da ich gerade gefahr laufe mich zu verzettel mal eine ganz einfache Frage:

Gleicht orthogonale Projektion (wie in Cobolds Beispiel mit gluOrtho2D(0.0, width, 0.0, height) umgesetzt) die unerwünschte Verzerrung aus ?
"In C++ it's harder to shoot yourself in the foot, but when you do, you blow off your whole leg." — Bjarne Stroustrup.

stef

Treue Seele

  • »stef« ist der Autor dieses Themas

Beiträge: 241

Wohnort: Kassel

Beruf: Softwareentwickler

  • Private Nachricht senden

13

30.09.2014, 21:31

@Schrompf: Vielen Dank für deine Mühe ... ist aber glaube ich etwas hoch für mich.

Da ich gerade gefahr laufe mich zu verzettel mal eine ganz einfache Frage:

Gleicht orthogonale Projektion (wie in Cobolds Beispiel mit gluOrtho2D(0.0, width, 0.0, height) umgesetzt) die unerwünschte Verzerrung aus ?

Was ist los ?
Habt ihr keinen bock mehr oder wisst ihr es nicht ?
"In C++ it's harder to shoot yourself in the foot, but when you do, you blow off your whole leg." — Bjarne Stroustrup.

BlueCobold

Community-Fossil

Beiträge: 10 859

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

14

30.09.2014, 22:18

Orthogonale Projektion hat nichts mit deiner Aspect Ratio zu tun, sondern mit einer Parallelprojektion. Die Seitenverhältnisse sind dabei noch immer Dir überlassen.
Und... drängel nicht. Das ist sehr unhöflich.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Schrompf

Alter Hase

Beiträge: 1 415

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

15

30.09.2014, 22:19

Ich hab meinen Beitrag geleistet. Wenn Du das nicht verstehst, was soll ich dann noch tun? Also hör auf zu drängeln, das empfinde ich in der Tat als ziemlich unverschämt.
Häuptling von Dreamworlds. Baut aktuell an nichts konkretem, weil das Vollzeitangestelltenverhältnis ihn fest im Griff hat. Baut daneben nur noch sehr selten an der Open Asset Import Library mit.

stef

Treue Seele

  • »stef« ist der Autor dieses Themas

Beiträge: 241

Wohnort: Kassel

Beruf: Softwareentwickler

  • Private Nachricht senden

16

01.10.2014, 00:39

:D :D :D ... last mich am leben.
Drängeln war eigentlich gar nicht meine absicht.
Hatte nur gesehe das Dot und Schrompf schon im Thema unterwegs wahren ohne was zu schreiben.
Da dachte ich ihr hättet die Gedullt verloren und wollte mit ein bisschen humor nachhelfen ... ist offenbar ist das nach hinten los gegangen (hätte smilies machen sollen).

Also ... nix für ungut :thumbsup:
"In C++ it's harder to shoot yourself in the foot, but when you do, you blow off your whole leg." — Bjarne Stroustrup.

David Scherfgen

Administrator

Beiträge: 10 311

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

17

01.10.2014, 00:51

Gedullt

:cursing:
Mit einem L und T steht's schon auf der Zensurliste.
Dass jemand auf die Idee kommen könnte, es mit 2x L und T zu schreiben, hätte ich nicht gedacht.

stef

Treue Seele

  • »stef« ist der Autor dieses Themas

Beiträge: 241

Wohnort: Kassel

Beruf: Softwareentwickler

  • Private Nachricht senden

18

01.10.2014, 01:02

Gedu...t

:cursing:
Mit einem L und T steht's schon auf der Zensurliste.
Dass jemand auf die Idee kommen könnte, es mit 2x L und T zu schreiben, hätte ich nicht gedacht.

Ich hatte es erst mit einem l und t hinten geschrieben.
Dann hat die zensur losgeschlagen.
Da ich um 1:00uhr nachts mit smartphone im bett tippe, wollte ich das ding nur noch schnell auf die reise schicken und wusste mir nicht anderst zu helfen.

Wie wäre es denn mal mit einer richtigen rechtschreibkontrolle wenn dir das so wichtig ist ?
"In C++ it's harder to shoot yourself in the foot, but when you do, you blow off your whole leg." — Bjarne Stroustrup.

dot

Supermoderator

Beiträge: 9 833

Wohnort: Graz

  • Private Nachricht senden

19

01.10.2014, 08:40

Wie wäre es denn mal mit einer richtigen rechtschreibkontrolle wenn dir das so wichtig ist ?

Hat dein Browser sowas nicht eingebaut? ;)

stef

Treue Seele

  • »stef« ist der Autor dieses Themas

Beiträge: 241

Wohnort: Kassel

Beruf: Softwareentwickler

  • Private Nachricht senden

20

01.10.2014, 11:48

Zurück zum Thema ...
Orthogonale Projektion hat nichts mit deiner Aspect Ratio zu tun, sondern mit einer Parallelprojektion. Die Seitenverhältnisse sind dabei noch immer Dir überlassen.

Ich meinte natürlich Orthographische Projektion und nicht Othogonale Projektion ... sorry.
Auf jeden Fall habe ich Orthographische Projektion in meinen Shader aufgenommen und damit die Verzerrungen beseitigt.

Vielen dank an alle die was beigetragen haben und nochmals Entschuldigung wenn ich jemandem auf die Füsse getreten habe.
Es war wirklich humorvoll gemeint 8o
"In C++ it's harder to shoot yourself in the foot, but when you do, you blow off your whole leg." — Bjarne Stroustrup.

Werbeanzeige