"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---0

    Nun 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-----0

    Nun ü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 gibt

    Variante 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.



  • @hellihjb

    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



  • @Gast25250

    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);
    


  • @hellihjb

    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).


Anmelden zum Antworten