使用vertexbuffer时为什么会出现渐变色线?

时间:2014-07-08 07:56:03

标签: c# opengl vertex-buffer

我使用OpenGL制作类似CAD / CAM软件的东西 起初我只是使用了glBegin和glEnd,它运行正常,但是当有很多顶点时它会变慢,所以我进行了搜索,发现有一个叫做vertexbuffer的东西。 所以我做了一个简单的程序来测试它用c#和sharpgl

编写的
//create a new buffer
gl.BindBuffer(OpenGL.GL_ARRAY_BUFFER, vertexId);
gl.BufferData(OpenGL.GL_ARRAY_BUFFER, vertexSize + colorSize, new IntPtr(0),OpenGL.GL_STREAM_DRAW);
gl.VertexPointer(2, OpenGL.GL_FLOAT, 0, new IntPtr(0));
gl.ColorPointer(3, OpenGL.GL_UNSIGNED_BYTE, 0, new IntPtr(vertexSize));
//update vertex buffer
public int UpdateVertexAt(float[] segments,int offset)
    {
        int len = segments.Length * sizeof(float);
        unsafe
        {
            fixed(float * p = segments)
            {
                IntPtr ptr = new IntPtr(p);
                gl.BufferSubData(OpenGL.GL_ARRAY_BUFFER, offset, len, ptr);
            }
        }
        c += segments.Length / 2;
        return len;
    }
//update color
 public int UpdateColorAt(byte[] rgb, int offset)
    {
       // gl.BindBuffer(OpenGL.GL_ARRAY_BUFFER, colorId);
        unsafe
        {
            fixed (byte* p = rgb)
            {
                IntPtr ptr = new IntPtr(p);
                gl.BufferSubData(OpenGL.GL_ARRAY_BUFFER, offset, rgb.Length, ptr);
            }
        }
        return rgb.Length;
    }
//draw scene
  public void Flush()
    {
        gl.EnableClientState(OpenGL.GL_VERTEX_ARRAY);
        gl.EnableClientState(OpenGL.GL_COLOR_ARRAY);
        gl.DrawArrays(OpenGL.GL_LINES, 0, 2 * c);
        gl.DisableClientState(OpenGL.GL_COLOR_ARRAY);
        gl.DisableClientState(OpenGL.GL_VERTEX_ARRAY);
    }

问题是我开始绘制线条看起来很干净而不是在正确的位置,当我绘制第一条线时它显示但是当我画出sconed线并且看起来像

enter image description here

我使用gl.GetBufferSubData检查了顶点和颜色,并且每件事看起来都正确,但是在使用时 gl.ColorPointer(3,OpenGL.GL_UNSIGNED_BYTE,0,新的IntPtr(0)),线条被绘制到位,每个东西都很好,除了颜色,我认为它是因为它将顶点读取为颜色

enter image description here

所以我在这里做错了什么?

1 个答案:

答案 0 :(得分:0)

我发现了问题,我使用1种颜色作为线条的起点和终点,这是导致渐变颜色的原因