C# DrawRange元素don';不要用正确的方式画

C# DrawRange元素don';不要用正确的方式画,c#,opengl,opentk,C#,Opengl,Opentk,我试图使用DrawRangeElements函数进行绘制,但由于某些原因,它没有绘制部分元素 例如,我有156分。我的每个元素包含52个点(3个元素x 52个点=156个点) 考虑这样的代码: //points contains 156 points float[] points = new float[] { 1f, 2f, 3f, // 0 //......... //refers to first ele

我试图使用
DrawRangeElements
函数进行绘制,但由于某些原因,它没有绘制部分元素

例如,我有156分。我的每个元素包含52个点(3个元素x 52个点=156个点)

考虑这样的代码:

        //points contains 156 points
        float[] points = new float[] {
        1f, 2f, 3f, // 0
        //.........            //refers to first element
        4f, 5f, 5f, //51

        6f, 7f, 8f, //52
        //.........            //refers to second element
        9f, 10f, 11f, //103

        6f, 7f, 8f,  //104
        //.........            //refers to third element
        9f, 10f, 11f, //155 
        };
使用抽屉组件一切正常

    var indices1 = Enumerable.Range(0, 52).Select(i => (uint)i).ToArray();
    var indices2 = Enumerable.Range(52, 52).Select(i => (uint)i).ToArray();
    var indices3 = Enumerable.Range(104, 52).Select(i => (uint)i).ToArray();

    GL.DrawElements(PrimitiveType.QuadStrip, 52, DrawElementsType.UnsignedInt, indices1);
    GL.DrawElements(PrimitiveType.QuadStrip, 52, DrawElementsType.UnsignedInt, indices2);
    GL.DrawElements(PrimitiveType.QuadStrip, 52, DrawElementsType.UnsignedInt, indices3);
但是对于DrawRangeElements我的effors失败了。三个元素中只有一个是绘图

        var indices = Enumerable.Range(0, 156).Select(i => (uint)i).ToArray();

        GL.DrawRangeElements(PrimitiveType.QuadStrip, 0, 51, 52, DrawElementsType.UnsignedInt, indices);
        GL.DrawRangeElements(PrimitiveType.QuadStrip, 52, 103, 52, DrawElementsType.UnsignedInt, indices); 
        GL.DrawRangeElements(PrimitiveType.QuadStrip, 104, 155, 52, DrawElementsType.UnsignedInt, indices); 

如何使用
DrawRangeElements
绘制我的3个元素?

您误解了
glDrawRangeElements()
的作用

电话

glDrawRangeElements(primtype, count, a, b, dtype, offsst;
正在呈现与相同的数据

无论
a
b
设置为什么。你只是没有定义 向德国劳埃德船级社谎报将要使用的范围时的行为。这里要做的是绘制相同的52个顶点3次,后两次调用中的范围参数无效

glDrawRangeElements()
只是一种性能优化。指定的范围定义索引数组中的最小值和最大值。因此,您可以向GL保证只访问顶点数组(和VBO)的某些部分,而不访问元素数组的某些部分。GL可以将此知识用于某些优化(例如,如果在draw调用后更新缓冲区的另一部分,GL知道它可以安全地执行此操作,而无需等待draw调用完成)

如果您想使用元素数组的不同部分,只需使用不同的偏移量(或者指针,在您的情况下,因为您似乎使用客户端数组)。但是,我想知道为什么您要使用
glDrawElements()
,因为
glDrawArrays
在您的场景中将是现成的,也避免了创建这样的abogus枚举数组的需要:

GL.DrawArrays(PrimitiveType.QuadStrip, 0, 52);
GL.DrawArrays(PrimitiveType.QuadStrip, 52, 52);
GL.DrawArrays(PrimitiveType.QuadStrip, 104, 52);

您误解了
glDrawRangeElements()
acutally的功能

电话

glDrawRangeElements(primtype, count, a, b, dtype, offsst;
正在呈现与相同的数据

无论
a
b
设置为什么。你只是没有定义 向德国劳埃德船级社谎报将要使用的范围时的行为。这里要做的是绘制相同的52个顶点3次,后两次调用中的范围参数无效

glDrawRangeElements()
只是一种性能优化。指定的范围定义索引数组中的最小值和最大值。因此,您可以向GL保证只访问顶点数组(和VBO)的某些部分,而不访问元素数组的某些部分。GL可以将此知识用于某些优化(例如,如果在draw调用后更新缓冲区的另一部分,GL知道它可以安全地执行此操作,而无需等待draw调用完成)

如果您想使用元素数组的不同部分,只需使用不同的偏移量(或者指针,在您的情况下,因为您似乎使用客户端数组)。但是,我想知道为什么您要使用
glDrawElements()
,因为
glDrawArrays
在您的场景中将是现成的,也避免了创建这样的abogus枚举数组的需要:

GL.DrawArrays(PrimitiveType.QuadStrip, 0, 52);
GL.DrawArrays(PrimitiveType.QuadStrip, 52, 52);
GL.DrawArrays(PrimitiveType.QuadStrip, 104, 52);

您误解了
glDrawRangeElements()
acutally的功能

电话

glDrawRangeElements(primtype, count, a, b, dtype, offsst;
正在呈现与相同的数据

无论
a
b
设置为什么。你只是没有定义 向德国劳埃德船级社谎报将要使用的范围时的行为。这里要做的是绘制相同的52个顶点3次,后两次调用中的范围参数无效

glDrawRangeElements()
只是一种性能优化。指定的范围定义索引数组中的最小值和最大值。因此,您可以向GL保证只访问顶点数组(和VBO)的某些部分,而不访问元素数组的某些部分。GL可以将此知识用于某些优化(例如,如果在draw调用后更新缓冲区的另一部分,GL知道它可以安全地执行此操作,而无需等待draw调用完成)

如果您想使用元素数组的不同部分,只需使用不同的偏移量(或者指针,在您的情况下,因为您似乎使用客户端数组)。但是,我想知道为什么您要使用
glDrawElements()
,因为
glDrawArrays
在您的场景中将是现成的,也避免了创建这样的abogus枚举数组的需要:

GL.DrawArrays(PrimitiveType.QuadStrip, 0, 52);
GL.DrawArrays(PrimitiveType.QuadStrip, 52, 52);
GL.DrawArrays(PrimitiveType.QuadStrip, 104, 52);

您误解了
glDrawRangeElements()
acutally的功能

电话

glDrawRangeElements(primtype, count, a, b, dtype, offsst;
正在呈现与相同的数据

无论
a
b
设置为什么。你只是没有定义 向德国劳埃德船级社谎报将要使用的范围时的行为。这里要做的是绘制相同的52个顶点3次,后两次调用中的范围参数无效

glDrawRangeElements()
只是一种性能优化。指定的范围定义索引数组中的最小值和最大值。因此,您可以向GL保证只访问顶点数组(和VBO)的某些部分,而不访问元素数组的某些部分。GL可以将此知识用于某些优化(例如,如果在draw调用后更新缓冲区的另一部分,GL知道它可以安全地执行此操作,而无需等待draw调用完成)

如果您想使用元素数组的不同部分,只需使用不同的偏移量(或者指针,在您的情况下,因为您似乎使用客户端数组)。但是,我想知道为什么您要使用
glDrawElements()
,因为
glDrawArrays
在您的场景中将是现成的,也避免了创建这样的abogus枚举数组的需要:

GL.DrawArrays(PrimitiveType.QuadStrip, 0, 52);
GL.DrawArrays(PrimitiveType.QuadStrip, 52, 52);
GL.DrawArrays(PrimitiveType.QuadStrip, 104, 52);