Fehler beim Schattenwurf mit Stencil Buffer



  • Hi,

    Kennt sich zufällig jemand mit dem NeHe-Tutorial zur Stencil-Buffer-Schatten-Erstellung aus?

    Ich hätte damit nämlich folgendes Problem mit dem Setzen der Verbindungen zwischen 2 Dreiecken:

    Wenn ich den unten stehenden Code auf ein komplexes Modell anwende, so werfen manche Dreiecke keinen Schatten, sondern die Schattenkante (die eigentlich nicht vorhanden sein dürfte) erscheint. Sobald ich SetConnectivity wieder deaktiviere, funktioniert der Schattenwurf wieder (allerdings mit den hässlichen Linien zwischen den Dreiecken). Folglich muss der Fehler irgendwo in folgendem Code vorhanden sein:

    void setConnectivity()
    		{
    			Def3D p1i, p2i, p1j, p2j;
    			int   i1i, i2i, i1j, i2j;
    			int   i, j, ki, kj;
    
    			Obj3D* o = getObject();
    
    			//jedes Dreieck wird mit jedem anderen Dreieck verglichen
    
    			for (i = 0; i < o->getTriangleCount(); i++)
    			{
    				for (j = i + 1; j < o->getTriangleCount(); j++)
    				{
    					//für jedes Dreieck werden alle 3 Punkte betrachtet
    
    					for (ki = 0; ki < 3; ki++)
    					{
    						//wenn sie bereits benachbart sind, wird mit dem nächsten Dreieck fortgefahren
    
    						if (!(o->getTri(i)->neigh[ki] == j))
    						{
    							for (kj = 0; kj < 3; kj++)
    							{
    								//die zu vergleichenden Punkte werden ermittelt
    
    								i1i = ki;
    								i1j = kj;
    								i2i = (ki + 1) % 3;
    								i2j = (kj + 1) % 3;
    
    								p1i = o->getTri(i)->edges[i1i].coords;
    								p2i = o->getTri(i)->edges[i2i].coords;
    								p1j = o->getTri(j)->edges[i1j].coords;
    								p2j = o->getTri(j)->edges[i2j].coords;
    
    								//wenn die Punkte der beiden Dreiecke gleich sind, sind diese Nachbarn
    
    								if (((p1i == p1j) && (p2i == p2j)) || ((p1i == p2j) && (p2i == p1j)))
    								{ 
    									o->getTri(i)->neigh[ki] = j + 1;
    									o->getTri(j)->neigh[kj] = i + 1;
    								}
    							}
    						}
    					}
    				}
    			}
    		}
    

    Def3D ist eine Klasse mit Variablen x, y und z (und Vergleichsoperator), in o sind alle wichtigen Daten gespeichert, der Rest der Variablen dürfte selbsterklärend sein ...

    Danke schon mal im Voraus

    MfG

    Thomas



  • Ergänzung:

    Ich habe jetzt noch ein Weilchen damit herumexperimentiert und bin nun zu dem Schluss gekommen, dass das Setzen der Connectivity nur bei nicht geschlossenen Körpern bzw. bei Objekten mit inneren Dreiecken, die gemeinsame Kanten mit äußeren Dreiecken besitzen nicht funktioniert...

    Äußerst merkwürdig ...


Anmelden zum Antworten