问题标签 [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 回答
180 浏览

webgl - 为什么 sRGB 扩展丢失了一个常数?

旧的 WebGL 上下文具有EXT_sRGB扩展名。该扩展公开了 4 个常量:

该扩展在 WebGL2 中得到推广并成为核心的一部分,但失去了一个常数。WebGL2 只有常量:

没有SRGB_ALPHA。更多的 WebGL2 上下文没有值为 35906 的常量。我确实检查了两个浏览器,情况是一样的。另外,我检查了我在本地拥有的所有其他扩展。WebGL2 中所有提升的扩展都将其所有属性合并到上下文中,但 sRGB。在文档中没有找到太多。

sRGB扩展有什么问题,损失背后的原因是什么?有人使用SRGB_ALPHA_EXT常量吗?如何?请分享你的经验。

此外,disjoint_timer_query扩展发生了一些奇怪的事情。该扩展被部分合并。WebGL2 上下文获得了扩展的一些属性。我disjoint_timer_query_webgl2在 Chrome 中拥有所有缺少的属性,除了一个getQueryObject重命名为 的属性getQueryParameter,但在 Firefox 中,disjoint_timer_query扩展仍然可用于 WebGL2 上下文。

0 投票
1 回答
758 浏览

webgl - WebGL2 中推广扩展的完整列表

我有机会将我们使用的渲染器更新为 WebGL2。为了使渲染器尽可能向后兼容,我们一直跟踪加载的扩展(就像我们在升级之前所做的那样)并模拟扩展,即使这样的扩展被提升。渲染器通过扩展做了一些相关的事情。从外面看,一切都非常透明。

为了使其顺利运行,我需要完整的推广扩展列表。找到了一些博客,但这些列表并不完整。我在 GitHub 上找到的其他列表看起来是错误的,因为它们有多余的扩展,实际上没有提升或被删除。我在文档中没有找到太多。

所以,我做了一些实证研究,发现:

特别是我担心不在我的列表中的扩展OES_texture_float_linearOES_texture_half_float_linearWebGL2 的实现我在本地有OES_texture_float_linear但没有OES_texture_half_float_linear,而 WebGL 两者都有。我知道在 WebGL1 上下文中的OES_texture_float_linear行为有点不同,所以我的直觉说可能存在问题。

此外,disjoint_timer_query扩展发生了一些奇怪的事情。该扩展被部分合并。WebGL2 上下文获得了该扩展的一些属性。我disjoint_timer_query_webgl2在 Chrome 中拥有除getQueryObject重命名为的属性之外的所有属性getQueryParameter,但在 Firefox 中,disjoint_timer_query扩展仍然可用于 WebGL2 上下文。

那么,这份清单是否完整?而且,特别是,应该OES_texture_half_float_linear在名单上?为什么它消失了,而类似的却OES_texture_float_linear留下了?

感谢你的帮助。

-

所以最终答案(可能)应该是:

请注意,最后三个扩展是带有警告的。扩展EXT_sRGB失去了一个常数SRGB_ALPHA。扩展OES_texture_half_float_linear被提升,而类比OES_texture_float_linear没有被提升。部分推广EXT_disjoint_timer_query。该扩展的一些属性出现在 WebGL2 上下文中,而其他属性被移到EXT_disjoint_timer_query_webgl2扩展中。此外,目前(2017.05.16)Firefox WebGL2 上下文仍然有EXT_disjoint_timer_query扩展,没有EXT_disjoint_timer_query_webgl2扩展。

0 投票
2 回答
419 浏览

javascript - 悬垂检测着色器 - 如何返回顶点的坐标?

我正在尝试使用three.js在浏览器中编写支持生成应用程序,我尝试了很多方法,但所有方法都很慢,所以现在我决定让着色器计算悬垂位置,我的程序构建支持这些点。

悬垂检测着色器输出: 悬垂检测

现在的问题是我无法弄清楚如何将这些红色区域返回给 CPU / 主 JavaScript 应用程序以生成对这些点的简单支持,我在这里读到了关于涉及 FBO 的 GPU CPU 方法但无法理解这一点,是有什么方法可以将红色区域坐标返回给 CPU?

我也可以在顶点着色器中计算这个以将非悬垂顶点的位置更新为 0,0,0,但问题是三个 JavaScript 中的顶点位置不会以这种方式更新,如果有某种方法可以在顶点着色器执行后获取更新的顶点位置,这可能是一个解决方案。

也许转换反馈?如何使用来自three.js 的转换反馈?

0 投票
1 回答
1521 浏览

webgl2 - Access to gl_InstanceID in WebGL 2 Instancing

I am trying to do instancing in WebGL 2. I want to use the built-in variable gl_InstanceID to index into a uniform float array.

I get the following error:

glDrawElementsInstancedANGLE: attempt to draw with all attributes having non-zero divisors

Is the only instancing allowed in WebGL 2 instancing with vertex attributes (instanced arrays)?

Also, is the spec the only definitive place to find out about these capabilities?

0 投票
1 回答
497 浏览

android - 什么是 OpenGL 中的“活动”统一块

OpenGL 文档不太清楚什么是活动的统一块(相对于那些不活动的块)。所以我的理解是它们在着色器程序中被引用/使用......或者是它!

考虑以下着色器程序:

顶点着色器

片段着色器


即使我不使用foodog统一块,查询以获取活动统一块的数量......

...对于这个着色器程序总是返回3 。无论我在 Android、iOS 还是 WebGL2 上运行,我都会得到相同的结果。我还没有在桌面OpenGL(相对于 OpenGL ES 3.0)上进行测试,但我不希望有不同的结果(但我想它可以?)。

  1. 那么,统一块处于活动状态意味着什么?
  2. 有没有办法只检索使用过的统一块(跳过未使用的块)?

谢谢!

0 投票
1 回答
1957 浏览

webgl2 - WebGL 2 何时清除绘图缓冲区?

我目前正在开发一个名为 readPixels的演示。

这个关于 SO 的答案preserveDrawingBuffer是我可以在该选项中找到的大部分信息。

在测试时,我观察到在 WebGL 2 中这个答案仍然正确 - 你必须设置preserveDrawingBuffertrue.

这真的正确吗?

是否有 OpenGL 等价物preserveDrawingBuffer

有什么方法可以设置preserveDrawingBufferfalse仍然调用 readPixels?

这个答案让您看起来可以打电话gl.flush

preserveDrawingBuffer 与刷新上下文有何相同之处?

0 投票
2 回答
2783 浏览

glsl - 绑定多个统一缓冲区对象

使用 WebGL 2,我们现在可以使用统一缓冲区对象。

它们看起来是个好主意,不必将通用制服附加到每个单独的程序(例如投影和视图矩阵,每个被渲染对象都通用)。

我创建了一个辅助类,每次我想绑定一个统一的缓冲区对象时都会调用它。

是否像这样创建统一缓冲区的想法

在我的渲染循环中,然后我通过调用更新“perScene”制服

然后我将查看场景中的所有对象,我的想法是像这样更新 perObject 统一缓冲区

我所说的vec4只是为了使示例更容易,但想法是在 perScene 上拥有矩阵(投影和视图),在 perObject 上拥有(对象和法线矩阵)。

在我的着色器中,我将它们声明为

我在这里有一个工作片段

我不应该看到一个白色方块,因为所有颜色加起来都会导致 avec4(1.0, 1.0, 1.0, 1.0)吗?(jsfiddle第41行)

我究竟做错了什么?谢谢

0 投票
1 回答
790 浏览

html - WebGL 帧缓冲区:gl.clearColor 似乎不会影响 FBO 中的 alpha 通道

我正在尝试将某些东西从 OpenGL 移植到 WebGL。我发现由于某种原因,gl.clearColor(0,0,0,0)当从我的帧缓冲区中调用时,似乎根本没有改变 alpha 值,而不是尝试在主后缓冲区上调用该函数,从而正确地渲染后缓冲区透明。

我相信我在 Fbo- 上正确设置了 RGBA 纹理

  • 内部格式为 RGBA16F
  • 格式为 RGBA
  • texel 设置为 FLOAT

(注意我记得内部格式通常也是 RGBA,但这会在 WebGL2 中引发错误,因为它与其他设置的组合无效)

任何人都知道如何让 alpha 透明度在帧缓冲区中工作?任何想法表示赞赏。

编辑:忘了注意在我的 OpenGL 代码中我没有使用混合

0 投票
1 回答
241 浏览

javascript - textImage2D 加载 1 个组件纹理而不复制

我正在尝试从ArrayBuffer包含 1 个组件的图像创建 2D 纹理。而且我想这样做而不将其复制到 4 个组件图像中。我想知道两者是否可行webglwebgl2对 webgl2 有更多希望)。

webgl 1

我试过这个

正如文档所说,我尝试了两个gl.LUMINANCEansgl.LUMINANCE_ALPHA

每个颜色分量都是...

gl.ALPHA例如它说的相反:

丢弃红色、绿色和蓝色分量并读取 alpha 分量

由此看来,很明显gl.ALPHA会期望一个 4 个组件的图像,而gl.LUMINANCE只会gl.LUMINANCE_ALPHA期望 1 个组件。
但是当我执行以下操作时,我收到一个错误,告诉我缓冲区太小。如果我传入一个大小为 4 倍的缓冲区,则不会出现错误,因此它似乎也期待一个 4 分量图像。

我还尝试将宽度和高度除以 4,以为我可以在我的着色器上超越纹理坐标,但得出的结论是,这对于插值来说可能是个坏主意,或者我必须自己做。

webgl 2

所以我对 webgl 1 没有太多期望,但我很确定使用 webgl2 会很容易。但不幸的是,以下方法不起作用:

它正在做同样的抱怨缓冲区太小并且不会在缓冲区大 4 倍时抛出任何错误。

那么是否有可能使用任何(或两个)版本,或者我注定要创建一个包含 4 个组件的临时图像?

0 投票
2 回答
1962 浏览

javascript - Emscripten OpenGL (3) 给出版本错误

OS X - 铬。

我是 OpenGL / emscripten 的新手,并试图设置一个使用 WebGL 2、OpenGL 3+ 并通过 emscripten 构建到 webassembly 的简单脚本。

WebGL 1 / OpenGL 2 的编译没有问题。并且将画布设置为 WebGL 2 / OpenGL 3 似乎也有效。当我检查正在运行的当前版本时,它会通知我有关 OpenGL 3.0 和 WebGL2 的信息(但可能它没有使用它......?)。

但是,emcc 仍然对我提供的着色器仅与 3.0+ 版本兼容并因此暗示我正在运行 openGL 1/2 的错误尖叫?

通过 emscripten 设置新的上下文

着色器

当我在创建上下文后立即记录当前 OpenGL 版本时,

我明白了:

本平台支持的OpenGL版本OpenGL ES 3.0 (WebGL 2.0 (OpenGL ES 3.0 Chromium))

Chrome 控制台这样说

我这样调用 emscripten,启用了 FULL_ES3 和 WEBGL2。

在此处输入图像描述

谢谢!