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

MannyDasMammut

Treue Seele

  • »MannyDasMammut« ist der Autor dieses Themas

Beiträge: 76

Wohnort: Baden - Würtemberg / Achern

Beruf: Schüler

  • Private Nachricht senden

21

11.05.2004, 15:59

Das bedarf jetzt einer kleinen erklärung

Also der Renderprozess schaut imgesammten so aus

Die Engine ruft die 1. Renderfunktion des Benutzers auf diese wird aufgerufen bevor die Engine überhaupt etwas zeichnet ich benutze sie um mein eigenes Skysystem zu machen.

Nun rendert die Engine den eigenen Sky und das Level und dann ruft sie die nächste methode auf mit welcher ich zusätzliche Levelgeometrie zeichnen kann.

Nun zeichnet die Engine alle 3D Modelle. Und dann ruft sie die letzte Fuktion auf mit welcher ich wieder eigene Modelle zeichnen kann.

Die Engine verwendet Cameras bzw. Views die sie in einer Struktur kapselt. Ich habe in der Struktur die Position und die Ausrichtungswinkel in Grad. Ich müsste aus denen also eine neue View Matrix erstellen nur weiß ich nicht so richtig wie ich den LookAt Punkt aus Position und Winkel berechnen kann.

Die Restlichen Werte die ich für die Projektionbenötige ist auch kein Problem. Clip_Range hab ich und auch alle anderen für die Projektionsmatrix.

Ich müsste also nur wissen wie ich aus Position und Winkel wieder den Look At Point bekomme.
Werde ich hier eigentlich noch gebrauch ansonsten würd ich gerne nach Hause gehen und meine graue Wand anstarren.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

22

11.05.2004, 16:32

Zitat


Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
vs_1_1 

dcl_position v0 
//zuerst die w
mul r0.w v0.w c0.w
mad r0.w v0.w c1.w r0.w
mad r0.w v0.w c2.w r0.w
mad r0.w v0.w c3.w r0.w
move oPos.w r0.w
// jetzt hab ich mir nen bein gestellt da ich nicht weis wie teilen geht
rcp r0.w r0.w

//x
mul r0.x v0.x c0.x
mad r0.x v0.x c1.x r0.x
mad r0.x v0.x c2.x r0.x
mad r0.x v0.x c3.x r0.x
mul oPos.x r0.x r0.w
//usw



das is sicher langsamer ( falls es überhaupt funzt, hab jezt nicht nachgerechnet ), da die CPU nur einmal transponieren müsste, der vertx shader aber für jeden vertex!
weiters verwenden die D3DX funktionen hoch opimierten code ( inkl. SSE, 3DNow! usw. falls vorhanden ).

achja:

zum "teilen" gibts keinen vertex shader befehl ( so wie DIV oder so, zumindest nicht in vs_1_1 ), das musst schon so wie du über rcp und mul machen.

MannyDasMammut

Treue Seele

  • »MannyDasMammut« ist der Autor dieses Themas

Beiträge: 76

Wohnort: Baden - Würtemberg / Achern

Beruf: Schüler

  • Private Nachricht senden

23

11.05.2004, 18:57

Ist ja schön und gut aber

He das ist ja jetztmit dem Teilen schön und gut aber es geht mir nicht um den Shader code sonder wie ich aus den Kamerawinkeln und der Kamera Position den LookAtPoint berechnen kann so das ich mir die Matrix selbst wieder erstellen kann.
Werde ich hier eigentlich noch gebrauch ansonsten würd ich gerne nach Hause gehen und meine graue Wand anstarren.

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

24

11.05.2004, 19:56

@dot Also wenn es um vertices geht ist die gpu alle mal schneller und nen m4x4 ist ein marco für 4x dot4. Das ist wiederum nichts anderes als:

Quellcode

1
2
(src0.x * src1.x) + (src0.y * src1.y) + 
         (src0.z * src1.z) + (src0.w * src1.w);

Also müsste in der theorie genauso schnell sein es zumindest genauso schnell sein.

Das mit dem Kamerawinkel musst du mir nochmal genau erklären... in bezug auf welchen vektor steht der?

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

25

11.05.2004, 20:53

Zitat von »"Nox"«

@dot Also wenn es um vertices geht ist die gpu alle mal schneller und nen m4x4 ist ein marco für 4x dot4. Das ist wiederum nichts anderes als:

Quellcode

1
2
(src0.x * src1.x) + (src0.y * src1.y) + 
         (src0.z * src1.z) + (src0.w * src1.w);



nehmen wir an du zeichnest 2000 polygone auf den bildschirm.

entspricht 6000 vertices ( trianglelist ) und is für die verhältnisse in einem mordernen spiel gar nix ( grad mal ein modell ).

mit deiner methode brauchst du 20 anweisungen nur damit du dir das transponieren der matrix sparen kannst
und das pro vertex macht 120000 wenn mich nicht alles täuscht.
mit der cpu variante brauchst du die matrix nur einmal zu transponieren, was sicherlich nie 120000 anweisungen brauchen wird.
im vertex shader brauchst du dann nur mehr 4 anweisungen pro vertex was im endeffekt auf 24000 kommt was weit weniger arbeit als.

nix gegen deine methode, wenn sie funktioniert, dann wird sie das.
aber m4x4 is sicher schneller, sonst würden das schließlich alle so machen.

MannyDasMammut

Treue Seele

  • »MannyDasMammut« ist der Autor dieses Themas

Beiträge: 76

Wohnort: Baden - Würtemberg / Achern

Beruf: Schüler

  • Private Nachricht senden

26

11.05.2004, 21:14

Also

Ich habe eine Struktur die ca. aussieht wie die folgenden:

Quellcode

1
2
3
4
5
struct sCamera
{
float x,y,z;
float Yaw,Pitch,Roll;
};


Die float Variablen X,Y,Z stellen die Position da. Die Float Variablen Yaw,Pitch, Roll stellen die Rotationswinkel. Will ich die Kamera z.B. um 90 ° um die Y Achse drehen dann erhöhe ich einfach Yaw um 90.

Das heißt wenn ich die Kamerabewege verändern sich auch die Positions und Rotationsvektoren. Da ich die View Matrix brauche und man die ja mit dieser Funktion erstellen kann:

D3DXMatrixLookAtLH(&g_matView,&vecPos,&vecLookAt,&D3DXVECTOR3(0.0f,1.0f,0.0f));

vecPos muss ja zweifellos die Cameraposition sein also

vecPos = D3DXVECTOR3(sCamera.x,sCamera.y,sCamera.z);


Mit den Winkeln müsste ich doch nun irgendwie den Lookat Punkt berechnen können. Und da weiß ich momentan nicht weiter
Werde ich hier eigentlich noch gebrauch ansonsten würd ich gerne nach Hause gehen und meine graue Wand anstarren.

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

27

11.05.2004, 22:16

hmmtja da muss man nun spekulieren, denn man nur raten wie der Ursprungs lookat Vektor aussieht. Denn nur dann kann man eigentlich den neuen errechnen. Wenn du bei den Gradzahlen 0 eingibst schaut der dan entlang welcher achse?

@dot also der code von mir war flasch. Aber nach einigen Änderungen funzt es nun. Das Shader sample ist mit der Standard Einstellung und multisampling auf stufe 6 850 mit meiner version 990 fps schnell.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

28

11.05.2004, 22:39

Zitat von »"Nox"«


@dot also der code von mir war flasch. Aber nach einigen Änderungen funzt es nun. Das Shader sample ist mit der Standard Einstellung und multisampling auf stufe 6 850 mit meiner version 990 fps schnell.


wie sieht der code jetzt aus?

MannyDasMammut

Treue Seele

  • »MannyDasMammut« ist der Autor dieses Themas

Beiträge: 76

Wohnort: Baden - Würtemberg / Achern

Beruf: Schüler

  • Private Nachricht senden

29

11.05.2004, 22:47

Dann schaut er entalng der Z Achse

Ja dann schaut er entlang der Z Achse.
Werde ich hier eigentlich noch gebrauch ansonsten würd ich gerne nach Hause gehen und meine graue Wand anstarren.

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

30

11.05.2004, 23:21

@dot also du musst die ripple.vsh ändern und zwar ab den dp4.

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
mov r10, r0;

; Transform position
; Transform position
mul r0.x, r10.x, c0.x 
mul r1.x, r10.y, c1.x
mul r2.x, r10.z, c2.x
mul r3.x, r10.w, c3.x

mul r0.y, r10.x, c0.y 
mul r1.y, r10.y, c1.y
mul r2.y, r10.z, c2.y 
mul r3.y, r10.w, c3.y

mul r0.z, r10.x, c0.z 
mul r1.z, r10.y, c1.z
mul r2.z, r10.z, c2.z
mul r3.z, r10.w, c3.z

mul r0.w, r10.x, c0.w 
mul r1.w, r10.y, c1.w
mul r2.w, r10.z, c2.w
mul r3.w, r10.w, c3.w

add r0, r0, r1
add r0, r0, r2
add oPos, r0, r3

Dann noch transpose rausknocken und dann funzt es. Ich habe, wie gesagt, beide hintereinander mit multi6 ausprobiert. (habe nen AMD daher kommt wahrscheinlich der Unterschied).

Zum thema: also ist der look at wenn vpos 0,0,0 ist 0,0,1. 0,1,0 wären dann deine 90 grad. hmmmm... mir fällt hierzu nur trigonometrie ein, aber ich bin zu müde um mir das jetzt noch zu überlegen
:sleep: .
[edit] hab doch noch etwas aus meinem Gehirn gekratzt.... also wenn wir sagen das die ankathete immer 1 ist könnte man mit dem GK/AK(glaube es war tan) wert die seitliche verschiebung feststellen. Beispiel:
also 0,0,1 wird mit yam um 45 zu 1,0,1 oder 0,0,1 wird mit 80° zu 5,67 0,1

Werbeanzeige