2016-04-02 15 views
0

Ich erstelle ein Graph-Zeichenprogramm mit OpenTK, um meine Computergrafik Übung abzuschließen.Schreibe Text in OpenTK

Das Problem ist, ich Text schreiben müssen glcontrol Punkt Koordinaten nur, wie dieses Bild, um anzuzeigen:

enter image description here

Bitte um Hilfe!

Hier ist mein Code:

private void glControl1_Paint(object sender, PaintEventArgs e) 
{ 
    if (!loaded) // Play nice 
    return; 

    GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit); 
    GL.LineWidth(2); 
    DrawingObjects.DrawOxy(leftOr, rightOr, topOr, bottomOr); 
    color = Color.Red; 
    GL.Color3(color); 
    glControl1.SwapBuffers(); 
} 


public static void DrawOxy(int lO, int rO, int tO, int bO) 
{ 
    GL.Color3(Color.Blue); 
    GL.Begin(BeginMode.Lines); 
    GL.Vertex2(lO, 0); 
    GL.Vertex2(rO, 0); 
    GL.Vertex2(0, tO); 
    GL.Vertex2(0, bO); 
    for (int i = lO; i < rO; i+=2) 
    { 
     GL.Vertex2(i, 0.5); 
     GL.Vertex2(i, -0.5); 
    } 
    for (int j = bO; j < tO; j+=2) 
    { 
     GL.Vertex2(0.2, j); 
     GL.Vertex2(-0.2, j); 
    } 
     GL.End(); 
} 

Tut mir leid, mein Englisch!

+0

nichts bisher. Ich wusste nicht, wo ich anfangen soll :( – tuankhoa1996

+0

Als Ausgangspunkt: OpenGL versteht nichts von "text", opengl kennt nur Polygone und Texturen, also müssen Sie eine Textur mit der gerenderten Schriftart erstellen und diese dann abbilden Textur zu Polygonen – Gusman

+0

War meine Antwort hilfreich? Ich kann mir andere Lösungen vorstellen, aber das ist definitiv die einfachste und robusteste. –

Antwort

1

Im Gegensatz zu dem, was Sie erwarten könnten, ist das Rendern einer einfachen Zeichenfolge mit einer Low-Level-Bibliothek wie OpenGL ziemlich schwierig. Aber im Grunde durchlaufen Sie die Zeichenkette und rendern für jedes Zeichen ein texturiertes Quad.

Mein Ansatz ist dies, speichern Sie alle möglichen Zeichen in einer Zeichenfolge.

static string CharSheet = "ab[email protected]#$%^&*()-=_+[]{}\\|;:'\".,<>/?`~ "; 

Erstellen Sie eine Textur, die diese Zeichen enthält. Die Beibehaltung einer einzigen Linie vereinfacht die Berechnungen.

BitmapFont

Dann, wenn die Anwendung geladen wird, eine VAO für jedes Zeichen erstellen, die Vertexpositionen (Größe des Quad) enthält, und es ist Textur-Koordinaten. Diese Schriftart wird Monospace, so dass die Vertexpositionen einfach sind:

float h = charHeight/(screenHeight/2); 
float w = charWidth/(screenWidth/2); 

Vector2[] vertices = new Vector2[]{ 
    new Vector2(0, h), 
    new Vector2(w, h), 
    new Vector2(w, 0), 

    new Vector2(0, h), 
    new Vector2(w, 0), 
    new Vector2(0, 0) 
}; 

Die Textur-Koordinaten sind jedoch abhängig von dem Index des Charakters in CharSheet:

float x1 = (charWidth/textureWidth) * i; 
float x2 = (charWidth/textureWidth) * (i + 1); 

Vector2[] textureData = new Vector2[] { 
    new Vector2 (x1, 0), 
    new Vector2 (x2, 0), 
    new Vector2 (x2, 1), 

    new Vector2 (x1, 0), 
    new Vector2 (x2, 1), 
    new Vector2 (x1, 1) 
}; 

Und ein Zeichen zu zeichnen, es ist einfach ein Angelegenheit der gleichen Index spezifiziert, und die gewünschten X, Y-Bildschirm-Koordinaten:

public static void draw(Shader shader, char character, float x, float y) 
{ 
    // Convert to pixel Co-ordinates 
    x = x/(screenWidth/2) - 1; 
    y = (screenHeight - y - charHeight)/(screenHeight/2) - 1; 
    Vector3 Position = new Vector3 (x, y, 0); 

    // Update shader with quad position 
    Matrix4 modelMatrix = Matrix4.CreateScale (scale) * Matrix4.CreateTranslation(Position); 
    GL.UniformMatrix4(shader.modelviewMatrixLocation, false, ref modelMatrix); 

    // Draw 
    GL.BindVertexArray(VAOs[ CharSheet.IndexOf(character) ]); 
    GL.DrawArrays (PrimitiveType.Triangles, 0, 6); 
} 

in Diesem resultierenden:

Result

0

OpenGL und OpenTK unterstützen kein integriertes Text-Rendering. Im Wesentlichen sind sie dafür zu "low-level". Nichtsdestoweniger erfordern viele Anwendungen, wie Ihre, Text-Rendering, und es wurde viel Arbeit geleistet, um effiziente Wege zu finden, Text über OpenGL (und natürlich OpenTK) zu rendern. Eine beliebte Technik basiert auf "Distanzfeldern", bekannt geworden durch ein 2007 SIGGRAPH Paper von Chris Green. In meiner eigenen Anwendungen habe ich die Unterstützung für Text-Rendering auf der OpenTK implementiert unter Verwendung von Techniken auf Basis von Distanzfeldern, und von der Gesamtqualität, Leistung und Flexibilität dieses Ansatzes sehr zufrieden:

http://www.valvesoftware.com/publications/2007/SIGGRAPH2007_AlphaTestedMagnification.pdf