需要有关健壮缓冲区访问何时有效的具体示例

时间:2019-06-10 10:41:53

标签: opengl-es

在(KHR_robustness.txt)中,有这样一段话: 启用后(访问可靠的缓冲区),元素数组中的索引将引用位于已启用属性的顶点缓冲区对象之外的顶点数据 [对于OpenGL ES]导致未定义的值 [对于OpenGL]导致读取零 对应的属性,但不会导致应用程序失败。

我不知道在什么情况下健壮的缓冲区访问将起作用(如果已启用)?

我尝试更改索引[]。让它索引超出数组范围。 但是无论我是否启用健壮的缓冲区访问,draw的结果都是将错误的索引点替换为(0.0,0.0,0.0,1.0)点。两者都不会导致应用程序失败。

原始代码

vertexArray[ ]={
-0.5,0.5,0.0,1.0,
-1.0,0.5,0.0,1.0,
-0.5,0.0,0.0,1.0,
-0.5,1.0,0.0,1.0,
}
indices[ ]={
0,1,2
1,2,3,
}
glDrawElements(GL_TRIANGLES,12,GL_UNSINGED_SHORT,0);

修改代码

vertexArray[ ]={
-0.5,0.5,0.0,1.0,
-1.0,0.5,0.0,1.0,
-0.5,0.0,0.0,1.0,
-0.5,1.0,0.0,1.0,
}
indices[ ]={
0,1,2
1,2,4,
}
glDrawElements(GL_TRIANGLES,12,GL_UNSINGED_SHORT,0);

// indices [6] = 4,当vertexArray [4]不在此数组中时,我认为在这种情况下发生了缓冲区访问不足。(对吗?)

1 个答案:

答案 0 :(得分:0)

  

但是无论我是否启用健壮的缓冲区访问,   绘制的结果是将错误的索引点替换为   (0.0,0.0,0.0,1.0)点。而且两者都不会导致申请   失败。

在未启用扩展的情况下,实现定义了越界访问的行为。它可能会在数组外部访问,可能会崩溃,可能会将边界数据替换为恒定值,可能会将访问限制在缓冲区范围内。它可能会意外地和不一致地选择其中的哪一个,因此应用程序无法安全地依赖任何内容。

规范的措辞是扩展名必须:

  

提供启用以确保越界缓冲区对象   GPU的访问将具有确定性的行为并排除   缓冲区不正确导致应用程序不稳定或终止   访问。

即不允许它崩溃,但是前面的列表中的其他任何行为只要能够始终如一地应用就可以。

总结;您看到的行为对于这两种情况都有效,但请注意,其他平台可能会给出不同的结果。