2016-04-02 441 views
0

OpenTKを使用してグラフ描画プログラムを作成して、コンピュータグラフィックスの練習を完了します。OpenTKにテキストを書き込む

問題は、私はちょうどこの絵のようにポイントの座標を示すためにglcontrolするテキストを記述する必要がある。

enter image description here

助けてください!私の英語について

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

申し訳ありません:

は、ここに私のコードです!

+0

何もこれまでのところ。私はどこから始めるべきか分からなかった:( – tuankhoa1996

+0

開始点として:OpenGLは "テキスト"について何も理解していない.WindGlgはポリゴンとテクスチャについてしか知りませんので、レンダリングされたフォントでテクスチャを作成し、テクスチャからポリゴンへ – Gusman

+0

私の答えは役に立ちましたか?私は他のソリューションについて考えることができますが、それは間違いなく最も簡単で最も堅牢です。 –

答えて

1

OpenGLのような低レベルのライブラリでは、単純な文字列をレンダリングするのはかなり難しいでしょう。しかし、基本的に、文字列を繰り返して、各文字のテクスチャ付きクワッドをレンダリングします。

私のアプローチはこれです。可能なすべての文字を文字列に格納します。

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

これらの文字を含むテクスチャを作成します。 1行に保持すると計算が簡単になります。

その後

BitmapFont

、アプリケーションの負荷、各文字のVAOを作成し、(クワッドのサイズ)頂点位置を含む、それはテクスチャ座標です。

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

テクスチャ座標ただし、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) 
}; 

と文字を描画するために、それは単にですこのように得られた

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

:同じインデックス、及び所望のX、Y画面座標を特定の問題

Result

0

OpenGLとOpenTKは、任意の組み込みのテキストレンダリングをサポートしていません。基本的に、それらはあまりにも「低レベル」です。それにもかかわらず、あなたのような多くのアプリケーションでは、テキストレンダリングが必要であり、OpenGL(およびOpenTKも同様)を介してテキストをレンダリングする効率的な方法を見つけるために重要な作業が行われています。 1つの一般的な手法は、Chris Greenの2007 SIGGRAPH論文で有名な「距離フィールド」に基づいています。私自身のアプリケーションでは、私は距離フィールドに基づいた技術を使用して、OpenTKの上にテキストレンダリングのサポートを実装している、と全体的な品質、性能、およびこのアプローチの柔軟性により、非常に満足している:

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

関連する問題