我使用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线并且看起来像
我使用gl.GetBufferSubData检查了顶点和颜色,并且每件事看起来都正确,但是在使用时 gl.ColorPointer(3,OpenGL.GL_UNSIGNED_BYTE,0,新的IntPtr(0)),线条被绘制到位,每个东西都很好,除了颜色,我认为它是因为它将顶点读取为颜色
所以我在这里做错了什么?
答案 0 :(得分:0)
我发现了问题,我使用1种颜色作为线条的起点和终点,这是导致渐变颜色的原因