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.07.2012, 15:14

Artefakte bei Phongshading(Punktlicht)

Ich habe einen neuen Shader für Punktlichter geschrieben. Leider haben die Modelltexturen starke Artefakte(siehe Bild). Woher stammen sie? Wie beheb eich das Problem? Ohne den Shader sind keine Artefakte da. Mein 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
// Vertexshader
VS_OUTPUT_POINT VS_PointLighting(VS_INPUT IN)
{
    VS_OUTPUT_POINT OUT;

    float3 worldPos = mul(float4(IN.position, 1.0f), worldMatrix).xyz;
    
    OUT.position = mul(float4(IN.position, 1.0f), worldViewProjectionMatrix);
    OUT.texCoord = IN.texCoord;
    OUT.viewDir = cameraPos - worldPos;
    OUT.lightDir = (light.pos - worldPos) / light.radius;
    OUT.normal = mul(IN.normal, (float3x3)worldInverseTransposeMatrix);
    OUT.diffuse = material.diffuse * light.diffuse;
    OUT.specular = material.specular * light.specular;
    
    return OUT;
}


// Pixelshader
float4 PS_PointLighting(VS_OUTPUT_POINT IN) : COLOR
{
  float atten_ = saturate(1.0f - dot(IN.lightDir, IN.lightDir) / atten);

    float3 n = normalize(IN.normal);
    float3 l = normalize(IN.lightDir);
    float3 v = normalize(IN.viewDir);
    float3 h = normalize(l + v);
    
    float nDotL = saturate(dot(n, l));
    float nDotH = saturate(dot(n, h));
    float power = (nDotL == 0.0f) ? 0.0f : pow(nDotH, material.shininess);
    
    float4 color = (material.ambient * (globalAmbient + (atten_ * light.ambient))) +
                   (IN.diffuse * nDotL * atten_) + (IN.specular * power * atten_);
             
    return color * tex2D(colorMap, IN.texCoord);
}


Wenn ich material.ambient entferne:

C-/C++-Quelltext

1
2
float4 color = ((globalAmbient + (atten_ * light.ambient))) +
                   (IN.diffuse * nDotL * atten_) + (IN.specular * power * atten_);

Ist alles heller(nicht gewollt) aber die Artefakte sind weniger. Aber immer noch vorhanden.

Hier das Bild:

(Link)


Danke

Zitat

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

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

09.07.2012, 16:55

Was die "Artefakte" betrifft, würde ich jetzt mal drauf tippen, dass sich das aus der Kombination von Materialfarbe, Texturfarbe und Attenuation einfach so ergibt.
Lass Textur und Material mal weg und gibt nur das Licht an sich aus.
Wie genau funktioniert eigentlich diese Berechnung von _atten, was is da die Idee dahinter?
OUT.diffuse und specular hängen nicht vom Vertex ab, würd ich daher also nicht interpolieren, sondern einfach im Pixel Shader berechnen.
Da l und v schon normalized sind, brauchst du h nicht normalisieren, Multiplikation mit 0.5 reicht.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

3

09.07.2012, 17:00

Da l und v schon normalized sind, brauchst du h nicht normalisieren, Multiplikation mit 0.5 reicht.

Bist du da sicher?
0.5 * ((1, 0) + (0, 1)) = (0.5, 0.5), aber die Länge davon ist nicht 1.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

4

09.07.2012, 17:17

Noch klarer wird's bei
0.5*((-0.99999, 0.0001)+(1, 0))
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

5

09.07.2012, 17:19

lol, stimmt, das war natürlich völliger Blödsinn, sry...

FSA

Community-Fossil

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

6

09.07.2012, 18:26

Wenn ich Textur und Material weg lasse, sind keine Artefakte vorhanden. Die Berechnung von atten_ ist eher ein Debugfeature. Damit kann ich nochmal die Lichtstärke beeinflussen. Je nach dem wie hoch ich atten setze, kann ich die Stärke veringern. Sonst hat es nur den Zweck das Licht abzuschwächen.

Wenn ich das Material weg lasse, habe ich keine richtigen Ergebnisse, oder?

Danke im Voraus.

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

7

10.07.2012, 07:46

Sind das vielleicht einfach nur JPEG-Artefakte in der Textur?

FSA

Community-Fossil

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

8

10.07.2012, 17:25

Nein ich habe die Textur als BMP vorliegen.

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

10.07.2012, 17:28

Vielleicht war das Bild früher mal ein JPEG?

FSA

Community-Fossil

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

10

10.07.2012, 17:31

Das kann sein. Aber warum sehe ich die Artefakte nicht direkt in der Textur? Und vorallem warum sehe ich sie nur mit Shader.

Zitat

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

Werbeanzeige