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

FSA

Community-Fossil

  • »FSA« ist der Autor dieses Themas
  • Private Nachricht senden

1

09.12.2012, 14:59

BumpMapping mit mehreren Lichtern

Hallo.
Wie könnt eman ohne MultiPass BumpMapping bei mehrern Lichter verwnden?
Mein Aktueller HLSL Code:

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
35
36
37
38
//Pixelshder
float4 BumpMapPixelShader(PixelInputType input) : COLOR
{
    float4 textureColor;
    float4 bumpMap;
    float3 bumpNormal;
    float3 lightDir;
    float lightIntensity;
    float4 color;


    textureColor = tex2D( ColorMap, input.tex );
    
    bumpMap = tex2D( BumpMap, input.tex );

    bumpMap = (bumpMap * 2.0f) - 1.0f;

    bumpNormal = input.normal + bumpMap.x * input.tangent + bumpMap.y * input.binormal;
    
    bumpNormal = normalize(bumpNormal);

    lightDir = -lightDirection;

    if(!bOn)
    {
        lightIntensity = saturate(dot(input.normal, lightDir));
    }
    else
    {
        lightIntensity = saturate(dot(bumpNormal, lightDir));
    }

    color = saturate(diffuseColor * lightIntensity);

    color = color * textureColor;
    
    return color;
}

Ich dachte an eine Schleife, die sich so oft wiederhohlt, wie es Lichter gibt. Doch wie kann ich dann die Verschiedenen Ergebnisse miteinander verknüpfen? Mein Idee dazu:
Bei 2 Lichtern die zwei Farbwerte Addieren und durch 2 Teilen. Gibt es andere Methoden?

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »FSA« (16.12.2012, 21:54)


Legend

Alter Hase

Beiträge: 731

Beruf: Softwareentwickler

  • Private Nachricht senden

2

09.12.2012, 16:52

Ja, bei 2 Lichtern die zwei Farbwerte addieren und nicht durch 2 teilen!
Licht folgt da dem Superpositionsprinzip. Zwei Lichtquellen die auf dein Objekt
strahlen stören sich nicht.
"Wir müssen uns auf unsere Kernkompetenzen konzentrieren!" - "Juhu, wir machen eine Farm auf!"

Netzwerkbibliothek von mir, C#, LGPL: https://sourceforge.net/projects/statetransmitt/

3

09.12.2012, 17:26

Reflektiertes Licht verhält sich weitestgehend (es gibt gewiss in der Quantenphysik irgendwelche abgefahrenen Ausnahmen) additiv. Du kannst das Objekt also erst von der einen und dann von der anderen Lichtquelle beleuchten und zum Schluss addieren und bist fertig. Das durch 2 teilen ist also 'falsch' (Wobei natürlich in der Computergrafik alles richtig ist, solange es gut aussieht).

Also ja, eine Schleife ist schon korrekt, oder eben ein Shader, der 2 Lichtquellen verarbeitet und dann addiert. (Der Ambiente Term ist btw. auch einfach nur eine Lichtquelle und wird quasi als drittes mit draufaddiert).
Lieber dumm fragen, als dumm bleiben!

FSA

Community-Fossil

  • »FSA« ist der Autor dieses Themas
  • Private Nachricht senden

4

10.12.2012, 17:53

So ich habe jetzt gerade mal 2 Lichter hardgecodet. Das Ergebnis sieht gut aus nur gibt es einen Fehler!
In Bild eins(rotes Licht rechts), ist die Beleuchtung genau falsch rum am Würfel(roten Kanten müssten eigentlich Rechts sein). Wenn man den Würfel von der anderen Seite betrachtet, Bild2(weißes Licht rechts) stimmt alles.
Jemand eine Idee, warum das so ist und sogar eine Lösung? Eigentlich dürfte auf Bild 1 nicht mal Weißes Licht sein. Und aud Bild 2 kein rotes Licht.

Mein Pixelshader:

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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
////////////////////////////////////////////////////////////////////////////////
// Pixel Shader
////////////////////////////////////////////////////////////////////////////////
float4 BumpMapPixelShader(PixelInputType input) : COLOR
{
    float4 textureColor;
    float4 bumpMap;
    float3 bumpNormal;
    float3 lightDir;
    float lightIntensity;
    float4 color;

    for(int i = 0; i <= 1; i++)
    {
        textureColor = tex2D( ColorMap, input.tex );
    
        bumpMap = tex2D( BumpMap, input.tex );

        // Expand the range of the normal value from (0, +1) to (-1, +1).
        bumpMap = (bumpMap * 2.0f) - 1.0f;

        bumpNormal = input.normal + bumpMap.x * input.tangent + bumpMap.y * input.binormal;
    
        bumpNormal = normalize(bumpNormal);

        float3 lD = lightDirection;
        if(i == 1)
        {
            lD.xy = 0.0f;
            lD.z = 1.0f;
        }

        lightDir = -lD;

        if(!bOn)
        {
            lightIntensity = saturate(dot(input.normal, lightDir));
        }
        else
        {
            lightIntensity = saturate(dot(bumpNormal, lightDir));
        }

        float4 C = diffuseColor;
        if(i == 0)
             C.rgb = 0.7f;
        else
        {
             C.r = 1.0f;
             C.gb = 0.0f;
        }
        color += saturate( C * lightIntensity);
    }
    color = color * textureColor;
    
    return color;
}

Danke.
»FSA« hat folgende Bilder angehängt:
  • 1.png
  • 2.png

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »FSA« (10.12.2012, 18:06)


FSA

Community-Fossil

  • »FSA« ist der Autor dieses Themas
  • Private Nachricht senden

5

10.12.2012, 19:18

Das Problem tritt auch bei einem Licht auf sehe ich gerade.

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

FSA

Community-Fossil

  • »FSA« ist der Autor dieses Themas
  • Private Nachricht senden

6

11.12.2012, 14:42

Niemand eine Idee?

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

7

11.12.2012, 17:25

Niemand eine Idee?


Sind vielleicht die Normalen geflipped?
@D13_Dreinig

FSA

Community-Fossil

  • »FSA« ist der Autor dieses Themas
  • Private Nachricht senden

8

11.12.2012, 17:27

Jetzt ist die Frage, wie finde ich das raus? Welche Normalen meinst du? Und warum dann nur auf 3 Seiten des Würfels?

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

9

11.12.2012, 17:29

Der wievielte Thread zu deinem Shader ist das eigentlich jetzt schon?
Gefühlt der viertausendste ;)
Es hat doch offenbar mit mehreren Passes funktioniert, d.h. dass es jetzt nicht funktioniert, liegt wohl nur an einem "dummen" Programmierfehler. Den zu finden liegt in deiner Verantwortung, die Community ist nicht dein Debugger. Ja, es gibt Shader-Debugger!

FSA

Community-Fossil

  • »FSA« ist der Autor dieses Themas
  • Private Nachricht senden

10

11.12.2012, 17:33

Zitat von »David«

Der wievielte Thread zu deinem Shader ist das eigentlich jetzt schon?

Müsste der 5. sein ;)

Zitat von »David«


Es hat doch offenbar mit mehreren Passes funktioniert, d.h. dass es jetzt nicht funktioniert, liegt wohl nur an einem "dummen" Programmierfehler.

Wo habe ich dass denn geschrieben? Hier geht es nicht um Licht sondern um Bump Mapping. Es funktioniert weder mit einem Licht korrekt noch mit 2 Lichtern noch mit Multipass(logisch da ja auch nicht mit einem Licht ;) )

Zitat von »David«


Den zu finden liegt in deiner Verantwortung, die Community ist nicht dein Debugger. Ja, es gibt Shader-Debugger!

Was glaubst du was ich die letzten 2 Tage gemacht habe? ;)

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

Werbeanzeige