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
??? Es ist wohl eher anders herum. Sonst könnte AMD nicht mit einer geringeren CPU Frequenz die gleich Leistung bieten wie Intel.Zitat
Vielleicht weil die Optimierung für nen AMD nicht so gut sein könnte, wie für den Intel
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 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 |
vs.1.1 ; Constants: ; ; c0-c3 - View+Projection matrix ; ; c4.x - time ; c4.y - 0 ; c4.z - 0.5 ; c4.w - 1.0 ; ; c7.x - pi ; c7.y - 1/2pi ; c7.z - 2pi ; c7.w - 0.05 ; ; c10 - first 4 taylor coefficients for sin(x) ; c11 - first 4 taylor coefficients for cos(x) dcl_position v0 ; Decompress position mov r0.x, v0.x mov r0.y, c4.w ; 1 mov r0.z, v0.y mov r0.w, c4.w ; 1 ; Compute theta from distance and time mov r4.xz, r0 ; xz mov r4.y, c4.y ; y = 0 dp3 r4.x, r4, r4 ; d2 rsq r4.x, r4.x rcp r4.x, r4.x ; d mul r4.xyz, r4, c4.x ; scale by time ; Clamp theta to -pi..pi add r4.x, r4.x, c7.x mul r4.x, r4.x, c7.y frc r4.xy, r4.x mul r4.x, r4.x, c7.z add r4.x, r4.x,-c7.x ; Compute first 4 values in sin and cos series mov r5.x, c4.w ; d^0 mov r4.x, r4.x ; d^1 mul r5.y, r4.x, r4.x ; d^2 mul r4.y, r4.x, r5.y ; d^3 mul r5.z, r5.y, r5.y ; d^4 mul r4.z, r4.x, r5.z ; d^5 mul r5.w, r5.y, r5.z ; d^6 mul r4.w, r4.x, r5.w ; d^7 mul r4, r4, c10 ; sin dp4 r4.x, r4, c4.w mul r5, r5, c11 ; cos dp4 r5.x, r5, c4.w ; Set color add r5.x, -r5.x, c4.w ; + 1.0 mul oD0, r5.x, c4.z ; * 0.5 ; Scale height mul r0.y, r4.x, c7.w 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 |
Zitat
vs.1.1
; Constants:
;
; c0-c3 - View+Projection matrix
;
; c4.x - time
; c4.y - 0
; c4.z - 0.5
; c4.w - 1.0
;
; c7.x - pi
; c7.y - 1/2pi
; c7.z - 2pi
; c7.w - 0.05
;
; c10 - first 4 taylor coefficients for sin(x)
; c11 - first 4 taylor coefficients for cos(x)
dcl_position v0
; Decompress position
mov r0.x, v0.x
mov r0.y, c4.w ; 1
mov r0.z, v0.y
mov r0.w, c4.w ; 1
; Compute theta from distance and time
mov r4.xz, r0 ; xz
mov r4.y, c4.y ; y = 0
dp3 r4.x, r4, r4 ; d2
rsq r4.x, r4.x
rcp r4.x, r4.x ; d
mul r4.xyz, r4, c4.x ; scale by time
; Clamp theta to -pi..pi
add r4.x, r4.x, c7.x
mul r4.x, r4.x, c7.y
frc r4.xy, r4.x
mul r4.x, r4.x, c7.z
add r4.x, r4.x,-c7.x
; Compute first 4 values in sin and cos series
mov r5.x, c4.w ; d^0
mov r4.x, r4.x ; d^1
mul r5.y, r4.x, r4.x ; d^2
mul r4.y, r4.x, r5.y ; d^3
mul r5.z, r5.y, r5.y ; d^4
mul r4.z, r4.x, r5.z ; d^5
mul r5.w, r5.y, r5.z ; d^6
mul r4.w, r4.x, r5.w ; d^7
mul r4, r4, c10 ; sin
dp4 r4.x, r4, c4.w
mul r5, r5, c11 ; cos
dp4 r5.x, r5, c4.w
; Set color
add r5.x, -r5.x, c4.w ; + 1.0
mul oD0, r5.x, c4.z ; * 0.5
; Scale height
mul r0.y, r4.x, c7.w
m4x4 oPos, r0, c0
Der Unterschied dürfte nicht all zu hoch sein. Ist es doch so das bei SSE und SSE2 eine Matrixmultiplikation genau so in nur 4 Schritten volbracht werden kann wie bei den Shadern auch. Und bei den heutigen GPU's dürfte der Unterschied nur bei sehr hohem gebrauch von Shader Codes aufallen. Vor allem Dann wenn man ihn ständig wechseln muss. Dann sollte er nämlich auch so klein wie möglich sein.Zitat von »"dot"«
was is besser?
eine von profis hochoptimierte funktion die MMX oder SSE bzw. SSE2 oder 3dNow! auf und ab unterstützt einmal pro frame aufzurufen um die matrix zu transponieren, oder pro frame und vertex 20 statt 4 instruktionen von der gpu ausführen zu lassen.
glaub nicht, dass die gpu für ein dp4 gleich lang braucht wie für 4 muls.
sowas können sich nvidia bzw. ati bei den optimierungen einer modernen graka sicher nicht leisten.
was mich wundert sind die höheren fps bei deiner version
das shader vom dx sample macht um einiges mehr als nur zu transformieren.
macht das deiner auch?
Werbeanzeige