1

最後に、線を描画するための機能するコードをいくつか取得しました(Xamarin/monotouchで)

        //init calls
        Context = new EAGLContext (EAGLRenderingAPI.OpenGLES2);
        DrawableDepthFormat = GLKViewDrawableDepthFormat.Format24;
        EAGLContext.SetCurrentContext (Context);

        effect = new GLKBaseEffect ();
        effect.UseConstantColor = true;
        effect.ConstantColor = new Vector4 (1f, 1f, 1f, 1f); //white
        GL.ClearColor (0f, 0f, 0f, 1f);//black


    public void DrawLine(float[] pts) {
        //generate, bind, init
        GL.GenBuffers (1, out vertexBuffer);
        GL.BindBuffer (BufferTarget.ArrayBuffer, vertexBuffer);
        GL.BufferData (BufferTarget.ArrayBuffer, (IntPtr) (pts.Length * sizeof (float)), pts, BufferUsage.DynamicDraw);

        // RENDER //
        effect.PrepareToDraw ();
        //describe what's going to happen
        GL.EnableVertexAttribArray ((int) GLKVertexAttrib.Position);
        GL.VertexAttribPointer ((int) GLKVertexAttrib.Position, 2, VertexAttribPointerType.Float, false, sizeof(float) * 2, 0);
        GL.DrawArrays (BeginMode.LineStrip, 0, pts.Length/2);
    }

いくつか質問があります。

  1. 線を引くためのこのアプローチは最適ですか? 提案された改善点はありますか (つまり、アンチエイリアシングなど)。

        GL.Clear (ClearBufferMask.ColorBufferBit);
        effect.ConstantColor = new Vector4 (1f, 1f, 1f, 1f); 
        DrawLine (line);
        effect.ConstantColor = new Vector4 (1f, 0f, 1f, 1f); 
        DrawLine (line2);
    
  2. GL.Clear() を呼び出すと、行に関連付けられたすべてのメモリが消えますか? つまり、メモリのクリーンアップを行う必要がありますか、それとも GL.Clear() に続いて DrawLine() を呼び出し続け、メモリ管理について心配する必要はありませんか?

  3. これらの関数をグラフ化に使用する予定です。基になるデータが変更された場合 (ただし、行数は同じですが、行をより効率的に更新するために呼び出すことができる関数のサブセットはありますか?

4

1 に答える 1

2

GL.GenBuffers (1, out vertexBuffer)GPU にバッファを作成し、使用後に削除する必要があります。ほとんどの場合、頻繁に更新されず、それらのデータを何度も描画するために使用される GPU にデータをプッシュするためのバッファーを作成します。DynamicDrawただし、一定の更新のために(の代わりに)データをストリーミングするためのフラグがおそらくあります。これを使用して同じバッファを再利用することもできますが、データ ポインタを CPU から直接プッシュするのがおそらく最善でしょう。バッファに関する 3 行すべてを失い、最後の引数の 0 の代わりに挿入ptsします。VertexAttribPointer

これをグラフの描画に使用するとおっしゃっています。グラフ データがフレームごとに変更されるわけではなく、すべてのポイントを計算できる場合でも、バッファを利用したい場合があります。すべての行を独自のバッファーにプッシュしようとする代わりに、すべての行を単一のバッファーにプッシュしてみてください (軸も存在する可能性があります)。GL.DrawArrays (BeginMode.LineStrip, 0, pts.Length/2)最後の 2 つの引数が描画する現在のバッファー内の範囲を制御するため、特定の行を描画するために使用します (5 行目のみを描画するには、 と記述しますGL.DrawArrays(BeginMode.LineStrip, 5*2, 2))。したがって、グラフ データが更新されるタイミング。現在のバッファを削除し、新しいバッファを作成し、データをバッファにプッシュし、バッファをバインドし、頂点ポインタを設定してから、draw メソッドを呼び出し続けます。

GLClear は、メモリのクリーンアップとはまったく関係ありません。フレーム バッファにアタッチされたバッファのみをクリア (値を設定) します。この場合、レンダ バッファ内のすべてのピクセルを ClearColor で設定した色に設定します。これ以上何もない。他の一般的なケースは、深度バッファ、ステンシル バッファもクリアすることです...

すべての最適化とアンチエイリアシングに関しては、それはすべてあなたが何をしているかに依存し、一般的な答えはありません. ただし、シーンがエッジの効いたものになった場合は、マルチサンプリングを探してみてください。

于 2013-06-18T06:55:49.460 に答える