Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么';WebGL是否允许将相同的缓冲区绑定到数组\u缓冲区和元素\u数组\u缓冲区?_Webgl - Fatal编程技术网

为什么';WebGL是否允许将相同的缓冲区绑定到数组\u缓冲区和元素\u数组\u缓冲区?

为什么';WebGL是否允许将相同的缓冲区绑定到数组\u缓冲区和元素\u数组\u缓冲区?,webgl,Webgl,参考: 为什么WebGL不允许将相同的缓冲区绑定到数组和索引目标?因为WebGL需要安全,因为它在web浏览器中运行,任何随机站点或广告都可以运行WebGL代码 为了安全起见,它必须检查所有的用法没有读写任何超出范围的数据。一个简单的输入示例是使用较大的宽度和高度调用gl.texImage2D,但缓冲区太小。普通的C OpenGL会很高兴地读取超过缓冲区末尾的内容,但WebGL不会,并且会给出一个错误。一个简单的输出示例是调用gl.readPixels,并在给定的宽度和高度下将缓冲区设置为较小。

参考:


为什么WebGL不允许将相同的缓冲区绑定到数组和索引目标?

因为WebGL需要安全,因为它在web浏览器中运行,任何随机站点或广告都可以运行WebGL代码

为了安全起见,它必须检查所有的用法没有读写任何超出范围的数据。一个简单的输入示例是使用较大的宽度和高度调用
gl.texImage2D
,但缓冲区太小。普通的C OpenGL会很高兴地读取超过缓冲区末尾的内容,但WebGL不会,并且会给出一个错误。一个简单的输出示例是调用
gl.readPixels
,并在给定的宽度和高度下将缓冲区设置为较小。OpenGL很乐意将内存从缓冲区中丢弃。WebGL将生成一个错误

因此,类似地,当您调用
gl.drawerelements
时,您正在使用索引缓冲区来访问其他缓冲区中的数据。如果这些索引中的任何一个太大,它们将访问越界数据。例如,在具有3个顶点但索引为3的属性上有一个缓冲区。唯一的范围内索引是0、1和2。OpenGL不关心这一点,但WebGL关心这一点

因此,为了确保您不能这样做,WebGL必须验证您的索引。换句话说,它必须通读您的
元素\u数组\u缓冲区
,并检查是否没有索引会引用越界数据。要做到这一点,它必须在元素数组缓冲区中保留一份数据副本(因为OpenGL ES 2.0没有提供从缓冲区读取数据的方法,即使它这样做了,也会太慢)。WebGL在缓冲区中的数据副本使用内存,因此为了不浪费内存,只有使用
元素\u数组\u buffer
制作的缓冲区才保留其数据副本。其他缓冲区不需要有其数据的副本

由于这两种类型的缓冲区在WebGL中不兼容,因此您不能将其中一种同时绑定到
ARRAY\u BUFFER
ELEMENT\u ARRAY\u BUFFER
。要做到这一点,这两种缓冲区都需要保留数据的副本


注意:WebGL实现将与独立数据相关的信息缓存在
元素\u数组\u缓冲区中
。这意味着您第一次使用缓冲区为给定范围绘图时,WebGL将扫描数据副本,以确保没有索引超出范围。下次使用相同范围的相同缓冲区绘制时,如果未更改缓冲区中的任何数据,则WebGL已知道最高索引,无需再次扫描缓冲区。

那么是否仍有使用变换反馈生成元素数组缓冲区的方法?不直接。您必须调用
gl.getBufferSubData
来提取数据,然后使用
gl.bufferData
gl.bufferSubData
将数据上载到另一个缓冲区。我很想知道为什么要在着色器中生成索引缓冲区。一些很酷的技术?不,只是我需要生成一些非常大的地形网格,所以在GPU上做会更快。我想我可以在webworker中生成索引数组。我正在探索使用更多实例与使用更大的瓷砖之间的替代方案。