Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

21

12.08.2012, 14:09

Wie genau berechnest du deine Projektionsmatrix?

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

22

12.08.2012, 17:12

So:

C-/C++-Quelltext

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
template <typename T> void setPerspectiveLH(T FieldOfView, T Aspect, T Near, T Far)
{
            const T h = static_cast<T>(1.0 / tan((FieldOfView * M_PI / 180.0)/2.0));
            const T w = h / Aspect;
            
            M[ 0] = w;
            M[ 1] = 0;
            M[ 2] = 0;
            M[ 3] = 0;
            
            M[ 4] = 0;
            M[ 5] = h;
            M[ 6] = 0;
            M[ 7] = 0;
            
            M[ 8] = 0;
            M[ 9] = 0;
            M[10] = Far/(Far - Near);
            M[11] = 1;
            
            M[12] = 0;
            M[13] = 0;
            M[14] = (-Near*Far)/(Far - Near);
            M[15] = 0;
}

/* ... */

setPerspectiveLH(74.0, 1024.0/768.0, 1.0, 250.0);


Hab jetzt mal mit den Werten rumgespielt und ich bin zu dem Schluss gekommen: bei D3D11 gibt's an scheinend keine Clipping planes mehr :dash:
Hatte Near und Far mal auf 1 und 10, aber es wird echt nichts mehr abgeschnitten, nicht vorne und nicht hinten. Vlt. gilt ja auch: "It's not a bug, it's a feature" xD

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

23

12.08.2012, 18:06

Der Code schaut eigentlich richtig aus. Wie sieht denn die Matrix aus, die du in OpenGL verwendest? Kann es sein, dass du DepthClipping einfach ausgeschaltet hast (Rasterizer State)?

CodingCat

1x Contest-Sieger

Beiträge: 420

Beruf: Student (KIT)

  • Private Nachricht senden

24

12.08.2012, 18:10

Zeig mal den zugehörigen Vertex Shader.

Nachtrag: Richtig, DepthClipping ausgeschaltet ist wohl das Wahrscheinlichste. Damit liegt die Z-Clipping Plane nicht mehr bei der Near Plane, sondern direkt bei der Kamera (W = 0). Allerdings erhälst du vor der Near Plane dann mangels Clipping bei Z = 0 negative Z-Werte, was für den Tiefenpuffer vermutlich problematisch ist.
alphanew.net (last updated 2011-06-26) | auf Twitter | Source Code: breeze 2 | lean C++ library | D3D Effects Lite

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »CodingCat« (12.08.2012, 18:15)


LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

25

12.08.2012, 19:14

Ahhh, Tatsache, des lag am nicht auf true gesetzten "DepthClipEnable". Aber warum kann man das bei D3D11 deaktivieren? Hat das nicht Nachteile, und wie genau funktioniert das?
Es hat ja einen Grund bzw. mehrere, warum das all die Jahre mit D3D9 und GL nicht ging.

Danke für eure Hilfe :)

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

26

12.08.2012, 19:35

Das funktioniert genau so, wie dort steht. ;)
Das OpenGL Äquivalent ist wohl der GL_DEPTH_CLAMP State...

Werbeanzeige