问题标签 [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.
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_ALPHA8
,gl.RGBA8
但我想使用前者。
shader - WebGL2:将片段深度写入深度纹理
我在 WebGL2 中使用了一个简单的片段着色器,它将不同的颜色输出到两个不同的纹理目标中。如何将 gl_fragDepth 值的写入分配给第三个(深度)纹理目标(位置 = 2)?
webgl2 - 如何使用像素缓冲区对象在 WebGL2 中上传纹理?
目前,使用上传大型 4096x4096 纹理texImage2d
非常慢,在将纹理发送到 GPU 时锁定主线程并最终导致卡顿。
根据我的阅读,WebGL2 能够使用 PBO(像素缓冲区对象)以更有效的方式在 GPU 上创建纹理。但是,我无法在网上找到任何有关如何执行此操作的示例。
我找到了关于如何在OpenGL中实现这一点的很好的描述,但我不确定如何继续使用 WebGL API。
我想使用 aCanvas
或 anImageBitmap
作为纹理数据的来源。
到目前为止,我正在通过将纹理绘制到画布上进行测试,然后将图像转换为arrayBuffer
usingcanvas.toBlob()
后跟FileReader
and readAsArrayBuffer
。然后,一旦我实际上有一个有效的缓冲区,我就会尝试创建 PBO 并上传它。
我的代码的相关部分如下所示:
但这会返回错误:
GL_INVALID_OPERATION : glTexImage2D: pixel unpack buffer is not large enough
我真的不知道我是否正确地接近它,所以任何帮助将不胜感激。
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
有人遇到过类似的问题吗?
谢谢!
webgl - 有没有办法在着色器中测试 GLSL-ES 版本?
在诸如shadertoy 之类的 Web 工具中,我的片段着色器源包含在我无法控制或查看的 main() 中。如果我分发一些 GLSL 库,情况也是如此。
我的问题是确保 webGL2 和 1 之间的兼容性:如果浏览器或操作系统仅支持 WebGL1,我想编写 GLSL 后备来模拟缺少的内置 webGL2。-> 有没有办法从着色器测试当前的 webGL/GLSL 版本,就像我们为扩展的可用性所做的那样?
(顺便说一句,由于语言中包含了一些扩展,测试扩展变得越来越复杂:例如,尽管功能存在,但 GL_EXT_shader_texture_lod 在 webGL2 中未定义。因此能够测试 GLSL 版本至关重要。)
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 更聪明的技巧或简化。欢迎提出建议。
opengl - 可以使用桌面(非 ES)OpenGL 编译此 WebGL 2.0 代码吗?
我遇到了以下 GLSL 代码。我尝试在我的 OpenGL 桌面应用程序中编译它,但编译器显示“不支持的构造”:
我需要什么让它运行 - 什么 OpenGL 版本,什么 GLSL 版本?有可能吗?试过#version 130
了#version 450
。
这个数组声明语法甚至叫什么?因为我不知道,所以我不能谷歌它。
webgl - 我们是不是不允许在WebGL中将gl.ARRAY_BUFFER和Vertex Attrib Array绑定为0(二)
在 openGL 中,通常通过调用(OGL 等效项)“解除绑定”您的 ARRAY_BUFFER 和任何绑定的 VAO:
但是,当我在 WebGL (2) 中执行此操作时,出现以下错误:
我们不应该在 WebGL (2) 中这样做吗?
glsles - 如何在 WebGL 2.0 中获得 32 位整数纹理
我正在尝试在 WebGL 2.0 中创建具有 32 位红色通道的整数纹理:
并在 GLES 3.0 片段着色器中阅读它:
getTexCoord 函数:
我将第一个像素的值设置为1073741824,即 2^30,但是在片段着色器中读取它时,我得到了错误的值1100730680 。这里有什么问题?提前致谢。
webgl2 - 渲染到纹理 mipmap 级别
我试图了解渲染到特定纹理 mipmap 级别的正确方法。
在下面的示例中,我尝试将青色渲染为 .mipmap 级别 1 texture
。如果我在通话中将级别从1
更改为,画布将按预期显示青色。但是我不明白为什么这里只有级别有效,因为 WebGL 2/OpenGL ES 3 规范支持非零级别。0
framebufferTexture2D
0
我还尝试过显式分离级别 0(绑定到null
)和各种其他组合(即使用texImage2D
而不是texStorage2D
),但似乎没有一个组合呈现到 mipmap 级别。
我希望我在设置中做错了什么,但我找不到很多这样的例子。