Discussion:
bsp5: backface culling
(zu alt für eine Antwort)
Martin Grödl
2003-12-06 14:09:05 UTC
Permalink
mein backface culling liefert etwas komische ergebnisse:
Loading Image...

an rand der kugel werden einige polygone gezeichnet die eigentlich vom
betrachter wegschauen, also backfaces.
das ganze wird noch deutlicher, wenn man eine extremere perspektive
einstellt:
Loading Image...

das backface-culling hab ich so gemacht:
face-normals werden berechnet indem ich die ersten 3 punkte jedes
polygons betrachte (vertexTable[faceTable[i][2]] = erster punkt usw).
dann bilde ich einfach das kreuzprodukt von (punkt2 - punkt1) und
(punkt3 - punkt1) und das ist der normalvektor.

in CG1Object.draw() werden dann jene faces deren normalvektor ein z<=0
hat übersprungen.
außerdem musste ich CG1Object.transform() so ändern, dass die
faceNormals immer transformiert werden und nicht nur im render-mode
flatshaded. das weicht aber von der musterlösung ab, deshalb muss das
auch irgendwie anders gehn...

mein fehler muss wohl etwas damit zu tun haben, dass die face-normals
nur bis ins viewing-system transformiert werden...
bei den beispiel screenshots schauts jedenfalls nicht so aus

mich irritiert auch, dass im kommentar steht man soll das backface
culling im device-koord.system durchführen...wie soll das gehn?
Chris Chiu
2003-12-06 17:01:58 UTC
Permalink
Post by Martin Grödl
face-normals werden berechnet indem ich die ersten 3 punkte jedes
polygons betrachte (vertexTable[faceTable[i][2]] = erster punkt usw).
dann bilde ich einfach das kreuzprodukt von (punkt2 - punkt1) und
(punkt3 - punkt1) und das ist der normalvektor.
Vielleicht solltest du statt vertexTable lieber transVertices verwenden,
denn die sind bereits in jenem angesprochenen Device-Koordinatensystem. In
CG1Object::draw() kannst du das machen (falls du's nicht eh schon dort
gemacht hast).
Post by Martin Grödl
in CG1Object.draw() werden dann jene faces deren normalvektor ein z<=0
hat übersprungen.
außerdem musste ich CG1Object.transform() so ändern, dass die
faceNormals immer transformiert werden und nicht nur im render-mode
flatshaded. das weicht aber von der musterlösung ab, deshalb muss das
auch irgendwie anders gehn...
Damit solltest du dir auch diese Änderung ersparen können... berechne
einfach ausgehend von den bereits transformierten Vertizes
(transVertices[faceTable[i][2]] = erster Punkte usw.) so wie du's oben
beschrieben hast den Normalvektor und teste dann die Z Komponente.
Post by Martin Grödl
mein fehler muss wohl etwas damit zu tun haben, dass die face-normals
nur bis ins viewing-system transformiert werden...
bei den beispiel screenshots schauts jedenfalls nicht so aus
mich irritiert auch, dass im kommentar steht man soll das backface
culling im device-koord.system durchführen...wie soll das gehn?
sh. wie oben beschrieben.

Ciao,
Christoph
***@cg.tuwien.ac.at
Thomas Langbein
2003-12-07 12:36:46 UTC
Permalink
Hallo!

Ich habe dasselbe Problem wie Martin.
Post by Chris Chiu
Vielleicht solltest du statt vertexTable lieber transVertices verwenden,
denn die sind bereits in jenem angesprochenen Device-Koordinatensystem. In
CG1Object::draw() kannst du das machen (falls du's nicht eh schon dort
gemacht hast).
Die Normalvektoren sollen doch in calcFaceNormals() berechnet werden, wenn
ich das richtig verstanden habe!?
Wenn ich dort transVertices verwende, sehe ich nichts mehr - was nicht
weiter verwunderlich ist, weil calcFaceNormals() gleich am Anfang aus load()
aufgerufen wird, wo die transVertices noch nicht vorhanden sind.

Danke,
Thomas
Martin Grödl
2003-12-07 15:56:28 UTC
Permalink
hi,
Post by Thomas Langbein
Die Normalvektoren sollen doch in calcFaceNormals() berechnet
werden, wenn
Post by Thomas Langbein
ich das richtig verstanden habe!?
Wenn ich dort transVertices verwende, sehe ich nichts mehr - was nicht
weiter verwunderlich ist, weil calcFaceNormals() gleich am Anfang aus load()
aufgerufen wird, wo die transVertices noch nicht vorhanden sind.
also ich habs nach chris' posting jetzt folgendermaßen gemacht:
in calcFaceNormals() hab ich ersten drei Punkte vom vertexTable
genommen, und nicht von transNormals, sonst geht garnix wie du richtig
gesagt hast.

das backface culling hab ich aber dann ganz unabhängig von den bereits
berechneten FaceNormals gemacht, da diese ja nur bis ins viewing system
transformiert werden.
d.h.: gleicher code wie bei calcFaceNormals nur diesmal die
transVertices verwenden und danach abfragen ob das z vom normalvektor >=
0 ist, wenn ja überspringen, also continue.

mich hat auch am anfang die zeile
CG1Vector faceNormal = transFaceNormals[i];
direkt über dem TODO fürs backface culling verwirrt. die suggeriert
irgendwie, gleich dieses faceNormal zum backface culling zu verwenden...

aber nein, der krampus steckt im detail, denn wenn man weiter unten
schaut, sieht man dass die faceNormals zum flat-shaden verwendet werden.
trotzdem sollte die angesprochene codezeile erst nach dem
backface-culling stehen, um derartige verwirrungen auszuschließen.

mfg,
martin
Chris Chiu
2003-12-07 18:04:02 UTC
Permalink
Post by Thomas Langbein
Die Normalvektoren sollen doch in calcFaceNormals() berechnet werden, wenn
ich das richtig verstanden habe!?
Wenn ich dort transVertices verwende, sehe ich nichts mehr - was nicht
weiter verwunderlich ist, weil calcFaceNormals() gleich am Anfang aus load()
aufgerufen wird, wo die transVertices noch nicht vorhanden sind.
Ja, die Normalen für die Beleuchtung. Aber für das _Backface-Culling_, da ja
in Device-Koordinaten, kann man unabhängig davon aus transVertices
berechnen.

Ciao,
Christoph
***@cg.tuwien.ac.at

Loading...