使用 glDrawRangeElementsBaseVertex()

Posted

技术标签:

【中文标题】使用 glDrawRangeElementsBaseVertex()【英文标题】:Using glDrawRangeElementsBaseVertex() 【发布时间】:2013-02-04 13:08:12 【问题描述】:

我在 时遇到了一些疑问。

以下是源代码:

GLfloat vertices[]=
    
        -0.9,-0.9,1.0,1.0,
        -0.1,-0.9,1.0,1.0,
        -0.1,-0.1,1.0,1.0,
        -0.9,-0.1,1.0,1.0,


        0.1,0.1,1.0,1.0,
        0.9,0.1,1.0,1.0,
        0.9,0.9,1.0,1.0,
        0.1,0.9,1.0,1.0,

        -0.9,0.1,1.0,1.0,
        -0.1,0.1,1.0,1.0,
        -0.1,0.9,1.0,1.0,
        -0.9,0.9,1.0,1.0,

        0.1,-0.1,1.0,1.0,
        0.1,-0.9,1.0,1.0,
        0.9,-0.9,1.0,1.0,
        0.9,-0.1,1.0,1.0
    ;

GLuint indices_uint[]=
    
          0,1,2,3,222,//Triangle 0 
          4,5,6,7,222,//Triangle 1
          8,9,10,11,222,//Triangle 2    
          12,13,14,15,222,//Triangle 3

          4,5,6,7,222,//Triangle 1
          8,9,10,11,222,//Triangle 2    
          4,5,6,7,222,//Triangle 1        
          12,13,14,15,222//Triangle 3
    ;

glEnable(GL_PRIMITIVE_RESTART);

glPrimitiveRestartIndex(222);

glEnableVertexAttribArray(position);

glVertexAttribPointer(position, 4, GL_FLOAT, GL_FALSE, 0,vertices);

glDrawRangeElementsBaseVertex(GL_TRIANGLE_STRIP,0,7,10,GL_UNSIGNED_INT,indices_uint,4);

我不确定输出到底应该是什么。代码呈现三角形 1 和三角形 2。 当我将 [start,end] 作为 [0,7] 传递时,三角形 2 究竟是如何绘制的?

规范说:

Index values lying outside the range [start, end] are treated in the same way as glDrawElementsBaseVertex()

这是否意味着即使 8,9,10,11 超出 [0,7] 范围,它们仍将用于渲染?如果是这样,为什么我们必须 ?

【问题讨论】:

你根本没有使用glDrawRangeElementsBaseVertex。那是你的选择。就个人而言,除非您使用客户端顶点数组,否则我会说完全避免使用 Range 函数。当然,那我会说停止使用客户端顶点数组。 【参考方案1】:

规范说:

在该行之前,规范说:

还有一个额外的限制,即数组索引中的所有值必须位于 start​ 和 end​(含)之间,在添加 basevertex​之前。

开始和结束索引是添加基础顶点之前的索引。这个想法是您的开始/结束索引匹配索引数组中的内容,而不是后偏移索引值。

另外,你引用的那行是错字;实际规范说:

索引值超出范围 [start; end] 的处理方式与 DrawRangeElements 相同。

the OpenGL Wiki 上的错字已更正。

【讨论】:

您能否说明一下 basevertex 究竟是如何影响索引值的?我的理解是 basevertex 只是简单地添加到提供的索引数组中,即位置偏移量到索引数组中。所以在上面提到的例子中,在我将 4 作为 basevertex 值传递之后,三角形 1 和三角形 2 索引将被传递,即 &indices_uint[5] 到 &indices_uint[14] 数据将被提供。我的问题是如果我通过 [0,7] 范围三角形 2 不应该呈现,因为索引 8,9,10,11 超出了指定范围。如果我错了,请纠正我。 @maverick9888:范围与“渲染”的内容没有任何关系。如果索引超出范围,您将获得“实现定义的行为”。这包括但不限于“渲染良好”。或者“有时表现得很好,但有时却不行”。等等。 @maverick9888:至于basevertex是如何工作的,你是要我解释一下“indices​[i] + basevertex”是什么意思吗? 实际上“实现定义的行为”让我很困惑。当索引值超出 [start,end] 范围时,我在不同平台上得到不同的结果。现在明白了。我知道 basevertex 是如何工作的,但我认为它可能与 glDrawRangeElementsBaseVertex () 有一些不同的意义。 @maverick9888:Range 所做的唯一区别是提供 range 的规范。而已。正如我在答案中所说,范围是索引 before 基础顶点添加,而不是之后。因此,您的绘图命令具有完全定义的行为,它应该绘制这两个三角形。

以上是关于使用 glDrawRangeElementsBaseVertex()的主要内容,如果未能解决你的问题,请参考以下文章

在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?

今目标使用教程 今目标任务使用篇

Qt静态编译时使用OpenSSL有三种方式(不使用,动态使用,静态使用,默认是动态使用)

MySQL db 在按日期排序时使用“使用位置;使用临时;使用文件排序”

使用“使用严格”作为“使用强”的备份

Kettle java脚本组件的使用说明(简单使用升级使用)