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

BlazeX

Alter Hase

  • »BlazeX« ist der Autor dieses Themas

Beiträge: 478

Wohnort: DD

Beruf: Maschinenbau-Student

  • Private Nachricht senden

1

02.03.2010, 20:52

[D3D11] Vorbereitungen auf PostProcessing - ein paar Fragen

Hi Leute!
Ich habe wiedermal ein paar Fragen.
Angenommen, ich habe meine Szene brav in eine Multisampled-HDR-Textur gerendert...

1.) Sollte ich per ID3D11DeviceContext::Resolve runtersampeln oder erst im Shader. Hier geht es mir darum, was die beste Performance bietet.

2.) Wann wird ge"tonemap"ped?

3.) Wie kann ich eine ganze Textur auf einen Pixel runtersampeln?

BlackSnake

Community-Fossil

Beiträge: 1 549

Beruf: Student

  • Private Nachricht senden

2

02.03.2010, 20:57

du solltest auf jeden fall im shader "resolven". da gab es nen netten artikel in shaderX zu.
bei humus is tdiese technique angewand und die kannst den unterschied in dem sample ausprobieren: http://www.humus.name/index.php?page=3D&ID=77

evtl hilft dir das dx sample "HDRPipeline" weiter

BlazeX

Alter Hase

  • »BlazeX« ist der Autor dieses Themas

Beiträge: 478

Wohnort: DD

Beruf: Maschinenbau-Student

  • Private Nachricht senden

3

02.03.2010, 22:34

Frage 1) geklärt! Bleiben noch 2.

Zum Resolven: Ich bin fasziniert, dass bei so guter Qualität noch ein Performance-Schub drin ist! Das läuft nehmlich tatsächlich schneller, wenn ich per Shader runtersample. Das werde ich früher oder später einbauen!

BlackSnake

Community-Fossil

Beiträge: 1 549

Beruf: Student

  • Private Nachricht senden

4

02.03.2010, 23:06

im pixelshader resolvst du nicht direkt, greifst viel mehr auf die einzelnen samples zu und verrechnest diese. was anderes macht das resolven auch nicht (denke ich^^), aber du erhälst jedes mal nen overhead beim kopieren der ms texture in die normale ;)

zu zwei:
1. renderst du scene in eine texture(inklusive beleuchtung)
2. danach rechnest du die durchschnittliche helligkeit aus (runtersamplen)
3. post-processing effects (blur....)
4. post-processing (tone mapping)

tone mapping ist also die letzte sache, die du machen musst:)

BlackSnake

Community-Fossil

Beiträge: 1 549

Beruf: Student

  • Private Nachricht senden

5

03.03.2010, 22:56

dies hier könnte dir bei dem downsample evlt helfen:http://www.gamedev.net/community/forums/topic.asp?topic_id=498662
außerdem ist das dx bespiel, auf was ich bereits hingewiesen habe, doch sehr interssant "hdrpipline"
schönen abend noch :)

BlazeX

Alter Hase

  • »BlazeX« ist der Autor dieses Themas

Beiträge: 478

Wohnort: DD

Beruf: Maschinenbau-Student

  • Private Nachricht senden

6

08.03.2010, 18:34

@BlackSnake: Du hast nicht zufälligerweise den Shader-Code für das Runtersampeln parat und könntest ihn posten, oder? ;) Weil wegen vieleicht 10 Zeilen Code will ich mir nicht erst ShaderX 6 zulegen.

Ein paar andere Sachen:
1.) Ich würde meine PostProcessingShader gern per ConstantBuffer "einstellen", damit dynamische Veränderungen möglich sind. Ist es sinnvoll, den selben ConstantBuffer mehrmal pro Frame zu updaten, oder eher mit 2 oder mehr flippen? Genau das selbe würde mich auch für meinen "MaterialConstantBuffer" beim Scene-Rendering interessieren.

2.) Wie messe ich die Luminanz? Mein erster Ansatz war: R32_FLOAT Textur 1x1 Pixel erstellen. Szene in diese "LumTextur" rendern. Im PPShader wird dann die Luminanz (Graustufe) der Farbe berechnet. LumTextur sperren, auslesen, Wert (der einfach addiert werden muss) berechnen. Wert per ConstantBuffer an ToneMap-Shader übergeben. Im ToneMap-Shader dann den Wert einfach auf die Originalfarbe addieren.
Allerdings gefällt mir das mit dem Sperren und auslesen noch nicht so richtig.

3.) Sollte ich beim PostProcessing HDR-Texturen verwenden? Oder reichen LDR Texturen auch, nachdem ToneMapping angewandt wurde?

5.) Von der Reihenfolge her, würde ich das ganze so aufbauen:
- Szene rendern in MSAAHDR-Textur

- Resolven
- Luminanz messen
- Adaptives ToneMapping

- Alle anderen Shader (Bloom, Blur, DOF, EdgeFind, ...)

- Present
Passt das so?

BlackSnake

Community-Fossil

Beiträge: 1 549

Beruf: Student

  • Private Nachricht senden

7

11.03.2010, 20:00

in dem buch steht was zu dem resolven, nicht zum downsampeln, haste evtl falsch gelesen ;)

da versteh ich nicht sooo ganz, was das bewirken soll. sollen da werte drin stehe, wie exposure faktoren und so, oder die bloom stärke und so?

um die luminanz zu bekommen darfste nichtgleich in eine 1x1 texture rendern, da bekommste total falsche werte. du gehst da in kleineren schritten vor. also so 4-7 gänge solltest du schon haben, je nach auflösung und zum schluss müsste dann eben ne 1x1 texture dar stehen ;)

es müsste ausreichen, wenn du nur bei dem hdr durchgang ansich eine texture verwendest, die 16bit pro kanal hat. 32 ginge auch, aber da merkt man den unterschied nicht mehr wirklich und es braucht doch eben doppelen speicher. zudem haste diverse einschränkungen, was die 32bit familie angeht, also 16bit geht voll in ordnung :).

die reihenfolge ist vom prinzip ok. nur musste eben solche texturen wie die szene texture und so speicher, nicht nach dem messen und dem tonemapping löschen ;)

BlazeX

Alter Hase

  • »BlazeX« ist der Autor dieses Themas

Beiträge: 478

Wohnort: DD

Beruf: Maschinenbau-Student

  • Private Nachricht senden

8

11.03.2010, 20:42

Danke erstmal.

Ja, ich meinte das Resolven. Könntest du mir da den gefallen erweisen und was schicken (PN)?

Allerdings steht immernoch offen, wie ich aus der Luminanz ohne viel Aufwand meinen additiven Blendwert bekomme. Dieser Wert hellt das Bild entweder auf, oder verdunkelt es (ToneMapping). Und den will ich adaptiv anpassen.

Ich hab eine Idee!
Wenn ich auf die 1x1 Pixel Textur runtersample, müsste doch der PS nur einmal für genau diesen Pixel aufgerufen werden.
Darin wird dann aus der größeren Textur die eine Farbe gesampelt.
Und genau hier könnte ich den Blendwert einmal (pro Frame) berechnen lassen.
Wenn ich den auch noch global static deklariere, könnte ich ihn in beiden Shadern nutzen.
Was hälst du davon?
Oder ihr, ich würde ja gerne von allen die Meinung hören.

BlackSnake

Community-Fossil

Beiträge: 1 549

Beruf: Student

  • Private Nachricht senden

9

11.03.2010, 22:44

das habe ich jetzt mal aus dem beispiel von humus.name kopiert:

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
#if SAMPLE_COUNT == 1
Texture2D <float4> hdr;
#else
Texture2DMS <float4, SAMPLE_COUNT> hdr;
#endif

float exposure;

float3 main(PsIn In) : SV_Target {
    int3 texCoord = int3((int2) In.position, 0);

    float3 color = 0.0;
    [unroll]
    for (int i = 0; i < SAMPLE_COUNT; i++){
        float3 sample = hdr.Load(texCoord, i).rgb;
        // Tonemapping each sample individually

        color.rgb += 1.0 - exp2(-sample * exposure);
    }
    // Average

    color *= (1.0 / SAMPLE_COUNT);

    // We're outputting to an sRGB framebuffer, so this code is not needed.

    // However, for regular non-sRGB framebuffers this would be neccesary.

    //color = pow(color, 1.0 / 2.2);


    return color;
}

ist nur der pixelshader, aber die sache ansich wird dadruch deutlich klar. das ist der gleich aufbau, wie beim shaderX6 buch ;)

Werbeanzeige