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

  • »dot« ist der Autor dieses Themas

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

1

10.08.2004, 22:21

Pixel Shader Performance

kann es sein, dass pixel shader 2.0 schneller sind als pixel shader 1.1?

mein normalmapping läuft unter ps_1_1 und 4x multisampling mit ~350 fps und unter ps_2_0 bzw. ps_2_x mit ~380 fps.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

10.08.2004, 22:30

Kann schon sein, da in PS 2.0 einige Dinge mit einem einzigen Befehl erledigt werden können, die unter PS 1.1 oder 1.3 nur umständlich zu erreichen sind... habe übrigens jetzt auch Normal-Mapping implementiert, sogar mit Specular Highlighting per Pixel ;) echt ne geile Sache...

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

3

10.08.2004, 22:41

Helft mir mal auf die sprünge..wie hast du das mit nur 8 anweisungen hinbekommen(1.1)?

dot

Supermoderator

  • »dot« ist der Autor dieses Themas

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

4

10.08.2004, 22:49

wie hast du die specular highlights gemacht?

bei mir gibts da noch probleme:


(Link)


und


(Link)



ich verwend blinns lighting model und einen texture lookup für die specular power...

die vektoren ( l und h ) werden im ps normalisiert ( nicht über cubemaps, da das bei mir langsamer lief als per hand in asm aber gleiches ergebnis produzierte... )

ich vermute es hat was damit zu tun, dass beim dp3 zwischen normal und half vector auch negative werte auftreten können...

wie verhindert ihr das!?

dot

Supermoderator

  • »dot« ist der Autor dieses Themas

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

5

10.08.2004, 22:51

Zitat von »"Nox"«

Helft mir mal auf die sprünge..wie hast du das mit nur 8 anweisungen hinbekommen(1.1)?


1. wen fragst du
2. wie komsmt du auf 8 anweisungen

achja, für diffuse allein brauch ich 7 unter ps_2_0
mit specular sinds 13 ( dcl und def nicht mitgezählt )

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

6

10.08.2004, 23:10

Version Maximum number of instructions
1_x 8 for version 1_1.

dot

Supermoderator

  • »dot« ist der Autor dieses Themas

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

7

10.08.2004, 23:34

achso...

naja, es ist möglich ;)

allerdings wirds bei dieser beschräkung von der qualität her nicht so gut aussehn...

dot

Supermoderator

  • »dot« ist der Autor dieses Themas

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

8

10.08.2004, 23:43

ok, also ein problem ist behoben.

ich könnt mir in den ***** beißen, hab mit einem falschen register gearbeitet^^

jetzt siehts ja schon ganz brauchbar aus ;)


(Link)


zum vergleich einmal ohne normalmapping


(Link)


bleibt nur noch meine frage wie man sich um die artefakte die enstehen, wenn N dot H negativ ist kümmert ( habs mit max versucht, hat nicht geholfen )...

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

9

11.08.2004, 01:59

Zitat von »"Nox"«

Version Maximum number of instructions
1_x 8 for version 1_1.

4 Textur-Instruktionen
8 arithmetische Instruktionen,
wobei man ja auch manchmal zwei Instruktionen parallel laufen lassen kann, dann zählen sie nur als eine einzige.

Hier mal ein Bild von meiner Technik:
(16384 Dreiecke, ca. 480 FPS)


(Link)


Eingaben sind:
- 1 Diffuse-Map mit Alphakanal
- 1 Normal-Map mit Luminanz im Alphakanal (Faktor für Specular Highlights)
- materialEmissive, materialDiffuse, materialSpecular
- materialShininess (nur bei PS 2.0, da pow(x, y) benötigt wird)

Der Vertex-Shader berechnet den L-Vektor (Lichtquelle - Vertex) und den H-Vektor (halber Vektor zwischen Lichtquelle - Vertex und Kamera - Lichtquelle), die dann interpoliert werden. Der Pixel-Shader normalisiert sie wieder (mit einer Normalisierungs-Cube-Map).
Es entsteht übrigens ein netter Effekt, wenn man die Normalisierungs-Cube-Map mit Rauschen füllt, das sieht dann aus wie eine Wasseroberfläche...

Hier der PS 1.1-Quellcode:

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
30
31
32
33
34
technique tPS11
{
    pass p0 
    {       
        vertexShader = compile vs_1_1 vs();

        pixelShaderConstant4[0] = <materialEmissive>;
        pixelShaderConstant4[1] = <materialSpecular>;
        sampler[0] = <diffuseTextureSampler>;
        sampler[1] = <normalTextureSampler>;
        sampler[2] = <normalizationCubemapSampler>;
        sampler[3] = <normalizationCubemapSampler>;

        pixelShader = asm
        {
            ps_1_1
            tex t0
            tex t1
            tex t2  ; t2.xyz = encode(normalize(n))
            tex t3  ; t3.xyz = encode(normalize(h))

            dp3_sat r0.xyz, t1_bx2, t2_bx2  ; r0.xyzw = sat(dot(normalize(n), normalize(l))), alpha
                +mov r0.w, t0
            mul r0, r0, v0
            mad r0, r0, t0, c0
            dp3_sat r1.xyz, t1_bx2, t3_bx2  ; r1.xyzw = sat(dot(normalize(n), normalize(h))), luminance
                +mov_x4 r1.w, t1
            mul r1.xyz, r1, r1      ; dot * dot
            mul r1.xyz, r1, r1      ; dot * dot * dot
            mul r1.xyz, r1, r1.www  ; dot * dot * dot * luminance
            mad r0.xyz, r1, c1, r0
        };
    }
}


Der HLSL-Compiler hat's nicht hinbekommen (weder für 1.1 noch für 1.3), darum musste ich den Code per Hand schreiben.

dot

Supermoderator

  • »dot« ist der Autor dieses Themas

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

10

12.08.2004, 00:24

für diffuses normalmappig unter ps_1_1 allein reicht

Quellcode

1
2
3
4
5
6
7
8
9
10
ps_1_1

tex t0                              ;diffuse texture
tex t1                              ;normal map

;v0 ...light vector

dp3_sat r0, t1_bx2, v0_bx2      ;N dot L

mul r0, r0, t0                      ;N dot L * diffuse color


macht 4 anweisungen

und das ist nicht schneller als ps_2_0 mit specular.

die anzahl der dreiecke ist bei mir ziemlich egal ( fast gleiche fps bei 12 oder 10278 polys ), da der flaschenhals die füllrate ist und der vertex shader da kaum ins gewicht fällt...

Werbeanzeige