[C/C++] OpenGL Mauscursor rendern

posi90

Erfahrenes Mitglied
Hallo,

Ich möchte gerne den Mauszeiger in OpenGL rendern, um verschiedene Mauszeiger-Designs verwenden zu können.
Das ganze funktioniert fast perfekt, jedoch noch nicht ganz so, wie ich es mir vorstelle.

Um das ganze mal zu demonstrieren habe ich ein Video hochgeladen:
iabduabmztyqtbdmmfogjq.mp4


Dabei ist der Zeiger mit dem kleinen Dreieck der von OpenGL Gerenderte, und der andere der von Windows.

Beim Bewegen hinkt der Gerenderte etwas nach.

Meine Tools:
GCC 4.7.1 als Compiler
GLFW als OpenGL Library (übernimmt Mausbewegung via Callbacks)
Rocket als GUI (rendert den weißen Mauszeiger)

Das rote Dreieck am Mauszeiger wird so gezeichnet:

C++:
    int mx=0,my=0;
    glfwGetMousePos(&mx,&my);

    glPushMatrix();
        glTranslatef(mx, my, 0);
		glColor3f(1.0f, 0.0f, 0.0f);
        glBegin(GL_TRIANGLES);
            glVertex2f( 0.0f, 0.0f);
            glVertex2f( 0.0f, 10.0f);
            glVertex2f( 10.0f, 0.0f);
        glEnd();
    glPopMatrix();

Ich denke es ist ziemlich schwierig hier Aussagen zu treffen um mir weiterzuhelfen, aber vielleicht hatte jemand dieses Problem ja schon einmal.

Kann es eventuell daran liegen, dass nichts als Release compiliert wird?

mfg. posi90
 
Zuletzt bearbeitet von einem Moderator:
Das Problem ist, dass der Systemcursor extrem viel schneller updatet wird als deine OpenGL-Applikation. Das hat verschiedene Ursachen:
Als kleines Beispiel, ich habe meine Applikation die lediglich das tut:
C#:
                dev.Clear(ClearFlags.Target, 0, 1, 0);
                dev.BeginScene();

                drawCursor(dev, form);

                dev.EndScene();
                dev.Present();

Hier merkst du fast keine Verzögerung, schliesslich ist die Framerate extrem hoch. Wenn wir jetzt die Framerate künstlich drosseln auf ca 60 FPS merkt man schon, dass der Systemcursor schneller ist als der gezeichnete. Noch schlimmer wird es, wenn man dann VSync aktiviert und dadurch des öfteren present verzögert wird damit es mit dem displayupdate übereinstimmt, du merkst dann etwa das was man in deinem Video sieht. Deshalb verwendet man auch eigentlich nie softwarecursor sondern immer hardwarecursor.

Zudem eine Anmerkung zu deinem Code:
Der Immediate Mode sollte eigentlich nicht mehr verwendet werden, verwende vertexbuffer und shader.
 
Danke erstmal für die Erklährungen.

Aber wenn ich meine "künstliche Drossel" auf meinem Code entferne, merkt man den Unterschied nicht so krass, aber ist dennoch gut sichtbar (+1000 FPS).
Müsste der gerenderte Mauszeiger nicht springen, wenn der Systemzeiger schneller ist?

Wäre es klüger nach einer platformunabhängigen Bibliothek zum ändern von Mauszeigern zu suchen?

Das rote Dreieck im immediate Mode hab ich nur zum testen des weißen Cursors (librocket) genommen, das es einfach und schnell zu coden war. Der weiße Cursor wird über vertexarry, colorarray und texturecordarray gerendert.

mfg. posi90
 
Klüger wäre es wenn du keine softwarecursor verwendest, spätestens wenn dein Programm ein klein wenig komplexer ist wird dieser Effekt immer grösser und deutlicher sichtbar.
 
Warum der Cursor hinterher zu schweben scheint ist unser Gehirn in Aktion. Angenommen du bist so bei 30 FPS, dann ruckelt der Cursor in echt dem Systemcursor stark nach, ist aber wie du sagtest immer entweder dahinter oder am gleichen Ort, da es ja die aktuelle Position abfragt. Jetzt erinnern wir uns aber daran dass unser Auge ab etwa 25 Bildern pro Sekunde keine einzelnen Positionen mehr wahrnimmt sondern es als Bewegung "darstellt". Das Gehirn interpoliert dann sozusagen den Cursor mit einer Geschwindigkeit so dass er mit der entsprechenden verzögerten Zeit am neuen Ort ist. Das führt dann zu diesem gefühlten herumschweben des Cursors. Abhilfe gibt es keine, ausser du updatest den Cursor so schnell wie der Hardwarecursor.
 
Zurück