2017-05-01 5 views
1

Ich habe einen interessanten Bug, der mich seit ein paar Tagen "nervt".OGLFT zeichnet Text, wenn GLStipple verwendet wird

Ich verwende derzeit OpenGL, um Text auf einem Bildschirm zu zeichnen. Ich verwende die OGLFT-Bibliothek, um die Zeichnung zu unterstützen. Diese Bibliothek verwendet tatsächlich die freetype2-Bibliothek. Ich mache eigentlich nichts besonderes mit dem Text. Ich suche nur nach einfarbigem Text.

Wie auch immer, nach der Implementierung der Bibliothek, habe ich festgestellt, dass der Text nur korrekt gezeichnet wird, wenn ich glStipple aktiviert habe. Ich glaube, dass es zwischen der OGLFT-Bibliothek und dem, was ich aktiviere, zu Interferenzen kommt.

Ich frage mich, ob es jemanden gibt, der Erfahrung mit der OGLFT-Bibliothek hat. Ich poste ein minimalistisches Beispiel meines Codes, um zu demonstrieren, was vor sich geht:

(Bitte beachten Sie, dass es einige Variablen gibt, die verwendet werden, um den Zoomfaktor meiner glCanvas und die Position der Kamera zu bestimmen und dass dies nur ist für 2D)

double _zoomX = 1.0; 

double _zoomY = 1.0; 

double _cameraX = 0; 

double _cameraY = 0; 



/* This function gets called everytime a draw routine is needed */ 
void modelDefinition::onPaintCanvas(wxPaintEvent &event) 
{ 
    wxGLCanvas::SetCurrent(*_geometryContext);// This will make sure the the openGL commands are routed to the wxGLCanvas object 
    wxPaintDC dc(this);// This is required for drawing 

     glMatrixMode(GL_MODELVIEW); 
     glClear(GL_COLOR_BUFFER_BIT); 

     updateProjection(); 

    OGLFT::Monochrome *testface = new OGLFT::Monochrome("/usr/share/fonts/truetype/dejavu/DejaVuSansMono.ttf", 8); 
     testface->draw(0, 0, "test"); 
     glEnable(GL_LINE_STIPPLE);// WHen I comment out this line, the text is unable to be drawn 

     glLineStipple(1, 0b0001100011000110); 
     glBegin(GL_LINES); 
      glVertex2d(_startPoint.x, _startPoint.y); 
      glVertex2d(_endPoint.x, _endPoint.y); 
     glEnd(); 
     glDisable(GL_LINE_STIPPLE); 

    SwapBuffers(); 
} 

void modelDefinition::updateProjection() 
{ 
     // First, load the projection matrix and reset the view to a default view 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 

    glOrtho(-_zoomX, _zoomX, -_zoomY, _zoomY, -1.0, 1.0); 

    //Reset to modelview matrix 
    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 

    glViewport(0, 0, (double)this->GetSize().GetWidth(), (double)this->GetSize().GetHeight()); 
    /* This section will handle the translation (panning) and scaled (zooming). 
    * Needs to be called each time a draw occurs in order to update the placement of all the components */ 
    if(_zoomX < 1e-9 || _zoomY < 1e-9) 
    { 
     _zoomX = 1e-9; 
     _zoomY = _zoomX; 
    } 

    if(_zoomX > 1e6 || _zoomY > 1e6) 
    { 
     _zoomX = 1e6; 
     _zoomY = _zoomX; 
    } 

    glTranslated(-_cameraX, -_cameraY, 0.0); 
} 

auch ist eine Sache zu beachten, dass der Code unter den glEnable(GL_LINE_STIPPLE); erforderlich ist. Es ist so, als müsste der glStipple korrekt gezeichnet werden, damit der Text korrekt angezeigt wird.

Antwort

1

Wenn Sie Ihren Code durchsehen, glaube ich, dass Sie ihn als Graustufen darstellen möchten? Wenn ja, dann können Sie einfach die OGLFT::Grayscale *testface = new OGLFT::Grayscale("/usr/share/fonts/truetype/dejavu/DejaVuSansMono.ttf", 8);

verwenden. Dies wird erhalten, was Sie brauchen, ohne sich um das Problem kümmern zu müssen, das Sie gepostet haben. In der Tat, ich empfehle es auch so.

+0

Ja! Das war es, alles funktioniert jetzt. Ich danke dir sehr! – codingDude

Verwandte Themen