DrawRangeElements没有以适当的方式绘制

时间:2014-06-26 10:16:29

标签: 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 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 
        };

使用 DrawElements 一切正常。

    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 ,我的力量失败了。只绘制了三个元素中的一个。

        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个元素?

1 个答案:

答案 0 :(得分:3)

你误解了glDrawRangeElements()实际上做了什么。

电话

glDrawRangeElements(primtype, count, a, b, dtype, offsst;

呈现与

相同的数据
glDrawElements(primtype, count, dtype, offset);

无论ab设置为什么。你得到的不确定 当您向GL询问您将要使用的范围时的行为。你在这里做的是绘制相同的52个顶点3次,在后两次调用中使用无效的范围参数。

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

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

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