在WebGL中重现Cinder故障

时间:2014-06-05 20:25:37

标签: opengl three.js webgl texture2d cinder

在Cinder中使用OpenGL会出现视觉故障,如果可能的话,我想在WebGL中重现。

效果来自初始化具有大小的纹理,但没有任何数据。 基本上它是在GPU上显示垃圾内存(最终是桌面的碎片变色图像等)

对我正在处理的特定WebGL显示非常有用的效果。

如果向下滚动到gl::Texture标题,则会在this page上讨论以下效果:

http://libcinder.org/docs/v0.8.5/images_buffer.jpg

任何导致在WebGL / js上下文中发生这种情况的线索? (如果它们在浏览器中产生效果,我完全愿意使用其他资源/框架)

1 个答案:

答案 0 :(得分:6)

在任何情况下都无法在WebGL中生成此内容。

在OpenGL和OpenGL ES(WebGL所基于的)上,分配内存的初始化和这个"故障"效果是未定义行为的结果。

WebGL实际上定义了缓冲区/纹理内存的其他要求,以防止安全漏洞,其中之一是分配的内存始终初始化为 0 。因此,此行为 在WebGL中定义,并且它的定义方式使您的"故障"效果是不可能的。

  

WebGL Specification - 版本1.0.2 - 2013年3月

     

4安全性

     
    

4.1资源限制

         
      

纹理和顶点缓冲区对象(VBO)等WebGL资源必须始终包含初始化数据,即使它们是在没有初始用户数据值的情况下创建的。创建没有初始值的资源通常用于为纹理或VBO保留空间,然后使用texSubImage或bufferSubData调用对其进行修改。 如果未向这些调用提供初始数据,则WebGL实现必须将其内容初始化为0; 深度渲染缓冲区必须清除为默认的1.0清除深度。这可能需要创建一个与请求的VBO大小相同的临时缓冲区,以便可以正确初始化它。将数据加载到纹理或VBO中的所有其他形式都涉及ArrayBuffers或DOM对象(如图像),因此需要进行初始化。

             

当着色器通过诸如drawElements或drawArrays之类的调用访问WebGL资源时,WebGL实现必须确保着色器无法访问超出边界或未初始化的数据。有关必须由WebGL实现强制执行的限制,请参阅启用顶点属性和范围检查。