PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : ps 1.1 -> ps 1.4 - brauch da mal Hilfe


tb
2002-12-17, 11:38:20
Hallo!

Also so wird der Befehlsfolge unter dx8 beschrieben. Irgendwie komm ich nicht so recht weiter:

//u' = TextureCoordinates(stage m)UVW * t(n)RGB
//v' = TextureCoordinates(stage m+1)UVW * t(n)RGB
//w' = TextureCoordinates(stage m+2)UVW * t(n)RGB
//(u'', v'', w'') = 2*[(N*E)/(N*N)]*N - E
// where the normal N is given by
// N = (u', v', w')
// and the eye-ray vector E is given by
// E = (TextureCoordinates(stage m)Q,
// TextureCoordinates(stage m+1)Q,
// TextureCoordinates(stage m+2)Q)
//Lastly, the texm3x3vspec instruction samples t(m+2) with (u'',v'',w'')and stores the result in t(m+2).
//t(m+2)RGBA = TextureSample(stage m+2)RGBA


Dies ist der ps1.1 shader:
ps.1.1

tex t0 ; Define t0 as a standard 3-vector.
texm3x3pad t1, t0_bx2 ; Perform first row of matrix multiply.
texm3x3pad t2, t0_bx2 ; Perform second row of matrix multiply.
texm3x3vspec t3, t0_bx2 ; Perform third row of matrix multiply,
; do reflection calculation
; using eye ray, and sample texture 3
; specular map.

Hier mein bisheriger ps1.4 Teil

ps.1.4

texld r0, t0 ; Look up normal map.

texcrd r4.rgb, t1 ; 1st row of environment matrix
texcrd r2.rgb, t2 ; 2st row of environment matrix
texcrd r3.rgb, t3 ; 3rd row of environment matrix

dp3 r4.r, r4, r0_bx2 ; 1st row of matrix multiply
dp3 r4.g, r2, r0_bx2 ; 2nd row of matrix multiply
dp3 r4.b, r3, r0_bx2 ; 3rd row of matrix multiply

?

Thomas

Demirug
2002-12-17, 12:31:11
Wenn man diesen PS 1.1 auf einen PS 1.4 umbauen will wird man mit gleich mit 2 Problemen konfrontiert.

1. Der Eye-vector E wird beim 1.1 Shader als jeweils vierter Werte in den Texturkoordinaten welche die Matrix enthalten übertragen. Um diesen herauszubekommen wären wohl 3 texld Anweisungen notwendig da aber schon 4 verbraucht sind geht das nicht. Der Eye-vector muss also im Vertexshader auf eine eigene Texturkorrdinate kopiert und dann mit einer texld Anweisung geladen werden.

2. Die Formel enthält eine Division. Leider gibt es in den PS 1.4 keine Divisionsanweisung.

So auf Anhieb würde ich also sagen das es nicht geht. Aber möglicherweise fällt mir noch eine Lösung ein.

tb
2002-12-17, 14:43:46
Hmmm, noch ein paar texld nach der phase Anweisung sind kein Problem. Nur die Division, da hab ich auch schon überlegt...

Thomas

Demirug
2002-12-17, 14:48:05
Originally posted by tb
Hmmm, noch ein paar texld nach der phase Anweisung sind kein Problem. Nur die Division, da hab ich auch schon überlegt...

Thomas

Nach der phase Anweisung nützen sie dir nichts mehr. Man braucht ja den Eyevektor vor der Phase Anweisung um in der Phase 1 die Texturkoordinate für den depent-read komplett berechnen zu können.

Warum machts du dir eigentlich die Mühe den Shader auf 1.4 umzusetzen? Jede 1.4 taugliche Karte kann auch 1.1. Oder geht es dabei um einen Performances vergleich?

tb
2002-12-17, 18:43:22
Yeph, soll ein kleiner Shaderbenchmark werden. Ich portiere grad ein paar Shader von ps1.1 nach ps2.0. Der Weg über ps1.4 ist mehr ne Übung, da die Portierung von ps1.4 auf ps2.0 wesentlich simpler ist, als von ps1.0-1.3 nach ps2.0. Falls Du ne Idee hast, wie ich das Teil in den ps2.0 bekomme, würde dies auch genügen.

Thomas

Demirug
2002-12-17, 20:00:59
nach 2.0 ist einfacher:



ps_2_0

def c0,2,-1,0,0

texld r0, t0, s0 ; Look up normal map.

mad r0, c0.x, r0, c0.y; Scale [-1,1]

dp3 r1.x, t1.xyz, r0 ; 1st row of matrix multiply r1= N
dp3 r1.y, t2.xyz, r0 ; 2nd row of matrix multiply
dp3 r1.z, t3.xyz, r0 ; 3rd row of matrix multiply

mov r2.x,t1.w; r2 = E
mov r2.y,t2.w
mov r2.z,t3.w

dp3 r3.w,r1,r1; r3.w = N dot N
dp3 r4.w,r1,r2; r4.w = N dot E

rcp r3.w,r3.w
mul r4.w,r4.w,r3.w; r4.w = (N dot E)/(N dot N)

mul r4.w,r4.w,C0.x; *2

mad r3,r4.w,r1,-r2; *N - E

texld r0, r3, s1


Nicht getestet

Xmas
2002-12-17, 20:03:00
Originally posted by tb
Yeph, soll ein kleiner Shaderbenchmark werden. Ich portiere grad ein paar Shader von ps1.1 nach ps2.0. Der Weg über ps1.4 ist mehr ne Übung, da die Portierung von ps1.4 auf ps2.0 wesentlich simpler ist, als von ps1.0-1.3 nach ps2.0. Falls Du ne Idee hast, wie ich das Teil in den ps2.0 bekomme, würde dies auch genügen.

Thomas
Also ehrlich gesagt sehe ich nicht, wo die Konvertierung von 1.4 viel simpler sein soll als die von 1.3. Eigentlich müssen nur die tex-Instruktionen nachgebildet werden.

Die Division ist mit PS2.0 natürlich schön einfach per rcp und mul.

tb
2002-12-17, 20:32:10
Originally posted by Demirug
nach 2.0 ist einfacher:



ps_2_0

def c0,2,-1,0,0

texld r0, t0, s0 ; Look up normal map.

mad r0, c0.x, r0, c0.y; Scale [-1,1]

dp3 r1.x, t1.xyz, r0 ; 1st row of matrix multiply r1= N
dp3 r1.y, t2.xyz, r0 ; 2nd row of matrix multiply
dp3 r1.z, t3.xyz, r0 ; 3rd row of matrix multiply

mov r2.x,t1.w; r2 = E
mov r2.y,t2.w
mov r2.z,t3.w

dp3 r3.w,r1,r1; r3.w = N dot N
dp3 r4.w,r1,r2; r4.w = N dot E

rcp r3.w,r3.w
mul r4.w,r4.w,r3.w; r4.w = (N dot E)/(N dot N)

mul r4.w,r4.w,C0.x; *2

mad r3,r4.w,r1,-r2; *N - E

texld r0, r3, s1


Nicht getestet

Danke, ich werd ihn mal testen. Irgendwie hab ich scheinbar dir rcp Instruktion dauernd überlesen oder ich leide an Müdigkeitsblindheit nach nur 2 Stunde Schlaf .... Dinge gibt....

Thomas

Pitchfork
2002-12-20, 21:11:21
Scheinst diese Info ja dringend benötigt zu haben.... fällt ja fast schon unter übelstes Crossposting *g*
Wobei ich sagen muß, daß die Infos direkt von ATI und MS natürlich immer die besten sind....