使用 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有三种方式(不使用,动态使用,静态使用,默认是动态使用)