"Selektion" in OpenGL darstellen
-
OK, der Threadtitel ist blöd gewählt.
Folgendes Problem: mit Hilfe von OGL zeichne ich ein texturierts Quadrat in den 3D-Raum mittels eines Triangle Strips:
0---0
|\ |
| \ |
| \|
0---0Nun soll in Abhängigkeit von der Mausposition quasi ein Unterquadrat (wie viele Unterquadrate tatsächlich benutzt werden sollen, ist laufzeitvariabel, aber immer eine Zweierpotenz) als selangezeigt werden (wie dies angezeigt werden soll, da überlege ich noch, aber die plausibelste Variante ist, dass dieses z. B. halbtransparent mit einer anderen Farbe übermalt wird).
Beispiel (Unterteilung in 2 Unterquadrate):
0-----0
| |
| |
|XX |
|XX |
0-----0Nun überlege ich, wie ich dies am besten implementieren sollte:
Variante 0 (nicht funktionierend!!!):
Einfach ein solches Quadrat mittels 2 weiteren Triangles zeichen, funktioniert nicht aufgrund der üblichen klitzekleinen Rundungsabweichungen im Z-Buffer.Variante 1:
Da Variante 0 nicht geht, könnte man die in Variante 0 konstruierten Dreiecke minimal in Richtung Flächennormale verschieben. So wenig, dass der Unterschied nicht auffällt, aber so viel, dass das Z-Buffer-Flimmern verschwindet.Variante 2:
dynamisches Erstellen einer Textur, wobei die Interpolation durch "nächster Nachbar" statt linear erfolgt und Nutzen eines Texture Combiners diese mit der Textur des Quadrates kombinieren. Die Textur wird dann neu erstellt, wenn ein anderes Quadrat selektiert wird.
- ich weiß nicht, ob dies Geschwindigkeitsprobleme gibtVariante 3 (vermutlich am besten)
Erstellung eines Shaders, welcher als Parameter die Anzahl an Unterteilungen und das zu selektierende Quadrat bekommt
- wie sähe jedoch ein sinnvolles Fallback für Grafikkarten ohne Shader-Support aus?Zu welcher Variante würdet ihr mir raten? Oder sollte ich es ganz anders machen?
-
basierend auf deiner variante 2 setzt du die textur-koordinaten deines quadrates so, dass nur das hervorzuhebende sub-quadrat einen sinnvollen (eingefaerbten) texturbereich zugeordnet bekommt.
eine geeignete textur (4x4) koennte zb so aussehen:0000 0110 0110 0000"0" ist die grundfarbe, "1" die selektierte farbe.
das hervorzuhebene subquadrat muss dann textur-koordinaten 0.25..0.75 haben.
alles weitere erledigt das texture-clamping.
-
Die Idee gefällt mir. Auf jeden Fall eine ausgesprochen gute Variante für Fallback.
Damit wäre zumindest dieser Teil erledigt. Ich gehe mal davon aus, dass man dies für die Shader-Variante relativ 1 zu 1 ebenfalls umsetzen kann.
Daher danke
wolfgke
-
Variante 0 wäre der übliche Weg. Einfach den z-Buffer-Test ausschalten und dann die Dreiecke in der Gewünschten Art nochmal zeichnen.
Gruss, gast
-
Leider kommen da noch ein paar weitere Polygone in die Szene. Und da man standardmäßig nicht vorher testet, ob vielleicht ein überdeckendes Polygon vorher gezeichnet wurde (dafür ist ja der z-Buffer da), sehe ich keinen Weg, wie ich deine Idee in Code hämmern könnte.
-
wenn du nur einen teilbereich eines bereits gezeichneten polygons "uebermalen" willst, kannst du einfach nur die pixel *gleicher* z-koordinate zeichnen lassen:
glDepthFunc(GL_EQUAL);
-
Nein, ich glaube, das ist wirklich etwas ganz anderes und hilft mir nicht weiter. Sorry. (im Moment dabei, den von dir ursprünglich erläuterten Weg in Code zu gießen).