2

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

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

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

如果您向下滚动到标题,则在此页面上讨论以下效果gl::Texture

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

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

4

1 回答 1

7

在任何情况下都无法在 WebGL 中生成它。

在 OpenGL 和 OpenGL ES(基于 WebGL)中,分配内存的初始化不需要任何行为,这种“故障”效果是未定义行为的结果。

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

WebGL 规范-版本 1.0.2 - 2013 年 3 月

4 安全

4.1 资源限制

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

当着色器通过 drawElements 或 drawArrays 等调用访问 WebGL 资源时,WebGL 实现必须确保着色器不能访问越界或未初始化的数据。有关 WebGL 实现必须强制执行的限制,请参阅启用的顶点属性和范围检查。

于 2014-06-06T01:20:00.037 回答