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 行并插入pts最后VertexAttribPointer一个参数而不是 0。

您说您将使用它来绘制图形。如果图形数据不会在每一帧都被修改,并且您可以计算您仍然可能希望从缓冲区中受益的所有点。与其尝试将每一行推送到自己的缓冲区,不如尝试将所有行推送到单个缓冲区(甚至轴也可以在那里)。用于GL.DrawArrays (BeginMode.LineStrip, 0, pts.Length/2)绘制特定线,因为最后 2 个参数控制当前缓冲区中要绘制的范围(仅绘制第 5 行,您会写GL.DrawArrays(BeginMode.LineStrip, 5*2, 2))。所以当图形数据应该更新时;删除当前缓冲区,创建新缓冲区,将数据推送到缓冲区,绑定缓冲区,设置顶点指针,然后继续调用绘图方法。

GLClear 与内存清理完全无关。它只会清除(设置值)附加到帧缓冲区的缓冲区,在您的情况下,它将渲染缓冲区中的所有像素设置为您在 ClearColor 中设置的颜色。而已。其他常见情况还包括清除深度缓冲区、模板缓冲区……

至于所有的优化和抗锯齿,这一切都取决于你在做什么,没有一般的答案。尽管如果您的场景变得过于前卫,请尝试四处搜索多重采样。

于 2013-06-18T06:55:49.460 回答