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

BlackSnake

Community-Fossil

  • »BlackSnake« ist der Autor dieses Themas

Beiträge: 1 549

Beruf: Student

  • Private Nachricht senden

1

12.03.2008, 11:14

Normalvektoren falsch berechnet?

morgen,
ich habe ein kleines problem bei ganz normaler beleuchtung im shader (diffuse und speculare).
hier erst mal ein bild:
Bild

ich brechne die beleuchtung im pixelshader, aber trotzdem sieht es so aus, als ob ich auf vertexbasis beleuchten würden, man sieht hier immer die vierecke, aber auch oft kommt es vor, dass man sogar die dreiecke sieht.
jetzt liegt es natürlich nahe, dass die normalvektoren falsch sind, denn sie sind ja für die beleuchtung ein wichtiger bestandteil. berechnen tue ich sie folgendermaßen:

C-/C++-Quelltext

1
2
3
vec3 faceA = p[1] - p[0];
vec3 faceB = p[2] - p[0];
vec3 normal = normalize(cross(faceA, faceB));

p[0] - p[2] sind auch 3d vektoren.

hat jemand evtl eine nützliche idee oder einen hinweis, weshab ich das problem habe? dann nur her damit ;)

2

12.03.2008, 11:24

Bei den Kugeln sieht das so aus, als ob du ShadeMode = Flat verwendest.
An welcher Stelle berechnest du denn die Normalvektoren?

BlackSnake

Community-Fossil

  • »BlackSnake« ist der Autor dieses Themas

Beiträge: 1 549

Beruf: Student

  • Private Nachricht senden

3

12.03.2008, 11:28

ich berechnen den normal vektor im geometry shader ;)

S.Seegel

2x Contest-Sieger

  • Private Nachricht senden

4

12.03.2008, 11:40

Du berechnest die Normalen je Oberfläche (per Face). Soll heissen, du bekommst für alle drei(vier) Eckpunkte eines Dreiecks(Quads) identische Normalen. Folgerichtig ergibt sich dann über die gesamte Fläche die gleiche Beleuchtungsintensität.

Die analytisch korrekte Normale für eine Kugeloberfläche ist der Vektor vom Mittelpunkt der Kugel zum Vertex (natürlich normalisiert). Die Berechnung kann im Vertexprogramm erfolgen, wenn du den Mittelpunkt als uniform angibts (bleibt ja für alle Vertice einer Kugel gleich).
Dann erhälst du je Vertex eine Normale, die dann über die Fläche interpoliert einen gleichmäßigen Verlauf in der Beleuchtung bewirken.

CodingCat

1x Contest-Sieger

Beiträge: 420

Beruf: Student (KIT)

  • Private Nachricht senden

5

12.03.2008, 11:43

Das kommt ganz auf deinen Pixel Shader an. Wahrscheinlich vergisst du, die Normalen im Pixel Shader nocheinmal zu normalisieren. Das ist auf jeden Fall notwendig, sonst kommst du dank linearer Interpolation der Pixel Shader Inputs zum selben Ergebnis wie wenn du im Vertex Shader beleuchten würdest.

[EDIT]
Hätte mir das Bild zuerst ansehen sollen. Anhand des Bildes tippe ich ebenfalls auf per Face Normals - um trotzdem eine Kugelbeleuchtung zu erhalten, kannst du auch einfach die Face Normals an jedem Vertex zu einem Normal zusammenrechnen - im Pixel Shader musst du dann für "echte" per Pixel Beleuchtung allerdings trotzdem nochmal normalisieren.

S.Seegels Lösung ist natürlich ebenfalls eine Möglichkeit, aber doch sehr beschränkt auf Kugeln. ;-)

S.Seegel

2x Contest-Sieger

  • Private Nachricht senden

6

12.03.2008, 11:58

Zitat von »"CodingCat"«

kannst du auch einfach die Face Normals an jedem Vertex zu einem Normal zusammenrechnen

Das ist aber weder im Vertex- noch im Geometryshader machbar (zumindest nicht sinnvoll) ;)

BlackSnake

Community-Fossil

  • »BlackSnake« ist der Autor dieses Themas

Beiträge: 1 549

Beruf: Student

  • Private Nachricht senden

7

12.03.2008, 12:01

das problem habe ich ja nicht nur bei einer kugel, sondern auch bei einem torus knot...
eigentlich überall, bis auf bei würfeln, quadern, und pyramiden ;)

CodingCat

1x Contest-Sieger

Beiträge: 420

Beruf: Student (KIT)

  • Private Nachricht senden

8

12.03.2008, 12:02

Zitat von »"S.Seegel"«

Das ist aber weder im Vertex- noch im Geometryshader machbar (zumindest nicht sinnvoll) ;)


Das ist korrekt, aber da es sich hier wohl nicht um Kugeln, sondern allgemein um Polygonmeshes handelt, wäre die Frage wohl eher, ob die Berechnung der Normalen innerhalb dieser Einheiten dann überhaupt sinnvoll ist. :)

BlackSnake

Community-Fossil

  • »BlackSnake« ist der Autor dieses Themas

Beiträge: 1 549

Beruf: Student

  • Private Nachricht senden

9

12.03.2008, 12:13

naja,
das problem bleibt ja das selbe. ob nun im shader oder im code selbst.

CodingCat

1x Contest-Sieger

Beiträge: 420

Beruf: Student (KIT)

  • Private Nachricht senden

10

12.03.2008, 12:19

Im normalen Code kannst du problemlos auf alle Vertices und Faces zugreifen. Du gehst die Face Indizes durch, berechnest für jedes neue Face den entsprechenden Normal und addierst diesen zu dem Normal eines jeden zugehörigen Vertex. Anschließend normalisierst du die Normals aller Vertices und hast deine runde Beleuchtung.

Das geht natürlich nur dann, wenn keine doppelten Vertices pro Position existieren. Ansonsten müsstest du diese ausfindig machen und auch die Normals dieser nocheinmal zusammenrechnen.

Werbeanzeige