问题标签 [webgl2]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
559 浏览

webgl2 - 为什么我的 gl.generateMipmap 返回 GL_INVALID_OPERATION?

我正在尝试为使用 初始化的纹理创建 mipmap gl.texStorage2d(),但是GL_INVALID_OPERATION在调用gl.generateMipmap( gl.TEXTURE_2D ). 我的测试纹理是 128x128 并且在没有 mipmap 的情况下显示良好。

我可以在不使用 texStorage 的情况下创建 mipmap,但我在某处读到它可以让驱动程序更有效地执行。我在带有 NVIDIA GT 750M 的 macOS Sierra 上使用 Chrome 57.0.2987.133。

如何在仍然使用 texStorage 的同时修复错误?

我还注意到,如果我替换为 ,我的代码可以正常工作gl.SRGB8_ALPHA8gl.RGBA8但我想使用前者。

0 投票
2 回答
627 浏览

shader - WebGL2:将片段深度写入深度纹理

我在 WebGL2 中使用了一个简单的片段着色器,它将不同的颜色输出到两个不同的纹理目标中。如何将 gl_fragDepth 值的写入分配给第三个(深度)纹理目标(位置 = 2)?

0 投票
1 回答
2544 浏览

webgl2 - 如何使用像素缓冲区对象在 WebGL2 中上传纹理?

目前,使用上传大型 4096x4096 纹理texImage2d非常慢,在将纹理发送到 GPU 时锁定主线程并最终导致卡顿。

根据我的阅读,WebGL2 能够使用 PBO(像素缓冲区对象)以更有效的方式在 GPU 上创建纹理。但是,我无法在网上找到任何有关如何执行此操作的示例。

我找到了关于如何在OpenGL中实现这一点的很好的描述,但我不确定如何继续使用 WebGL API。

我想使用 aCanvas或 anImageBitmap作为纹理数据的来源。

到目前为止,我正在通过将纹理绘制到画布上进行测试,然后将图像转换为arrayBufferusingcanvas.toBlob()后跟FileReaderand readAsArrayBuffer。然后,一旦我实际上有一个有效的缓冲区,我就会尝试创建 PBO 并上传它。

我的代码的相关部分如下所示:

但这会返回错误:

GL_INVALID_OPERATION : glTexImage2D: pixel unpack buffer is not large enough

我真的不知道我是否正确地接近它,所以任何帮助将不胜感激。

0 投票
1 回答
3071 浏览

google-chrome - WebGL2 支持的显卡

是否有 WebGL2 支持/不支持的显卡列表?

我在两台计算机上遇到问题,它们都运行 Win7 和 Chrome 58(也在 56 上测试),启用了所有 WebGL 标志,一台计算机具有 nvidia quadro 600 和另一台 ati radeon HD 2400,两者都具有最新的驱动程序,我得到了浏览器不支持 WebGL2 的错误。我使用了 khronos 的一致性测试:https ://www.khronos.org/registry/webgl/sdk/tests/webgl-conformance-tests.html?version=2.0.1

有人遇到过类似的问题吗?

谢谢!

0 投票
1 回答
1820 浏览

webgl - 有没有办法在着色器中测试 GLSL-ES 版本?

在诸如shadertoy 之类的 Web 工具中,我的片段着色器源包含在我无法控制或查看的 main() 中。如果我分发一些 GLSL 库,情况也是如此。

我的问题是确保 webGL2 和 1 之间的兼容性:如果浏览器或操作系统仅支持 WebGL1,我想编写 GLSL 后备来模拟缺少的内置 webGL2。-> 有没有办法从着色器测试当前的 webGL/GLSL 版本,就像我们为扩展的可用性所做的那样?

(顺便说一句,由于语言中包含了一些扩展,测试扩展变得越来越复杂:例如,尽管功能存在,但 GL_EXT_shader_texture_lod 在 webGL2 中未定义。因此能够测试 GLSL 版本至关重要。)

0 投票
0 回答
634 浏览

algorithm - 我可以使用 WebGL 2 着色器有效地构建包围体层次结构吗?

将本文中的方法从 CUDA 应用到 WebGL 2 着色器是否可行并且仍然有效?

  • (1) 根据质心为每个图元分配一个莫顿码。
    • 应该很容易,因为在 WebGL 2 着色器中可以使用按位运算(AND、OR 等)。
  • (2) 对 Morton 码进行排序。
    • 您认为基于Histopyramids的桶/基数排序会起作用吗,首先是最重要的位?这将取代论文中的并行基数排序。WebGL 2 还有其他适用的排序方法吗?双音合并排序(实现起来似乎更复杂)?
  • (3) 构造二叉基数树。
    • 步骤 2 中的 Histopyramid 桶/基数排序是否也能够隐式构造树?还是需要另一个步骤?例如对于遍历指针(孩子?父母?命中和未命中指针?)。
  • (4) 为每个内部节点分配一个边界框。
    • 还没有想太多。

以前做过吗?我找不到。任何相关链接表示赞赏。我发现的最接近的是Space Partitioning - Kd-tree - Using WebGL。它在 JavaScript 中构建树,但它确实展示了如何在 WebGL 着色器中进行无堆栈树遍历。如果事实证明使用着色器构建 BVH 太难,我可能会用 JavaScript 构建它,因为 KD-tree 演示在我的机器上的 4096 个元素上“仅”使用 2 毫秒。不过,扩大规模会很酷。

我的目标是在 GPU 上为 RTS 游戏进行碰撞检测,缩放到尽可能多的单位和射弹。假定所有元素都是球形的。BVH每帧都会实时重建(60FPS留16ms,不考虑其他任务)。目前我能想到的任务有3个:

  • 单位重叠分散。
  • 目标选择(最近的邻居,因为攻击范围较远的单位可能匹配太多)。
  • 弹丸伤害应用。

也许有比使用 BVH 更聪明的技巧或简化。欢迎提出建议。

0 投票
2 回答
143 浏览

opengl - 可以使用桌面(非 ES)OpenGL 编译此 WebGL 2.0 代码吗?

我遇到了以下 GLSL 代码。我尝试在我的 OpenGL 桌面应用程序中编译它,但编译器显示“不支持的构造”:

我需要什么让它运行 - 什么 OpenGL 版本,什么 GLSL 版本?有可能吗?试过#version 130#version 450

这个数组声明语法甚至叫什么?因为我不知道,所以我不能谷歌它。

0 投票
1 回答
596 浏览

webgl - 我们是不是不允许在WebGL中将gl.ARRAY_BUFFER和Vertex Attrib Array绑定为0(二)

在 openGL 中,通常通过调用(OGL 等效项)“解除绑定”您的 ARRAY_BUFFER 和任何绑定的 VAO:

但是,当我在 WebGL (2) 中执行此操作时,出现以下错误:

我们不应该在 WebGL (2) 中这样做吗?

0 投票
1 回答
829 浏览

glsles - 如何在 WebGL 2.0 中获得 32 位整数纹理

我正在尝试在 WebGL 2.0 中创建具有 32 位红色通道的整数纹理:

并在 GLES 3.0 片段着色器中阅读它:

getTexCoord 函数:

我将第一个像素的值设置为1073741824,即 2^30,但是在片段着色器中读取它时,我得到了错误的值1100730680 。这里有什么问题?提前致谢。

0 投票
1 回答
981 浏览

webgl2 - 渲染到纹理 mipmap 级别

我试图了解渲染到特定纹理 mipmap 级别的正确方法。

在下面的示例中,我尝试将青色渲染为 .mipmap 级别 1 texture。如果我在通话中将级别从1更改为,画布将按预期显示青色。但是我不明白为什么这里只有级别有效,因为 WebGL 2/OpenGL ES 3 规范支持非零级别。0framebufferTexture2D0

我还尝试过显式分离级别 0(绑定到null)和各种其他组合(即使用texImage2D而不是texStorage2D),但似乎没有一个组合呈现到 mipmap 级别。

我希望我在设置中做错了什么,但我找不到很多这样的例子。