【问题标题】:WebGL: Texture access in a vertex shader?WebGL:顶点着色器中的纹理访问?
【发布时间】:2010-12-03 20:00:02
【问题描述】:

是否可以使用 WebGL 从 顶点 着色器中读取纹理?

我写了一个WebGL page(只是为了尝试一下)并使用 Chrome 7 进行了测试。一旦我升级到 Chrome 8,它就停止了工作。我仔细检查了 webgl 是否已启用。错误是:

'texture2D': 找不到匹配的重载函数

当我用常量替换对 texture2D 的调用时,它可以工作。 使用相同纹理的片段着色器中的纹理访问也有效。

有人有什么想法吗?我对升级 Chrome 导致它崩溃的事实感到特别震惊。

更新:它适用于 Firefox 4 beta。我报告了 Chrome 的一个错误 - 问题 65340

更新 2:现在可以在 Firefox 和 Chrome 中使用

【问题讨论】:

  • 我认为这可能是某些实现的限制。
  • 我怀疑这是故意的。这会限制很多技术(例如置换贴图)。

标签: textures webgl vertex-shader


【解决方案1】:

这并不是 Chrome 中的真正“错误”。

顶点纹理访问不是 Open GL ES 2 的必需功能,它是 WebGL 规范的基础。我怀疑可能发生的情况是,尽管您的底层 GL 驱动程序支持顶点纹理访问,但现在您已经使用 Angle 切换到 Chrome,而 Angle 并未报告该顶点纹理访问可用。

您可以使用 Thatcher Ulrich 比较您的 FF 和 Chrome 版本

http://webgl-bench.appspot.com/

这有 MAX_VERTEX_TEXTURE_IMAGE_UNITS 参数(接近尾声)Chrome/Angle 总是报告 0.t

要检查的另一件事是您使用的是正确的 texture2D 语法 - 规范已更改,可能 FF 仍支持旧语法。

【讨论】:

  • 那个网站很棒。谢谢。它实际上在 Chrome 7 中工作(我尝试降级)。知道为什么他们会放弃该功能吗?阻止硬件功能有什么好处吗?
  • 正如 einSelbst 下面所说的,这不是“放弃”功能的问题。 Angle 使用 DX9 模拟 Open GL ES 2.0,ES 2.0 的最小顶点纹理计数为 0。如果选择非 Angle 渲染器,它将使用底层显卡 Open GL 实现,这可能很好地支持该功能。请注意,默认情况下,FF 和 Chrome 都将使用 Angle。我建议您查看 Angle 项目,并询问他们是否愿意实现顶点纹理支持。见code.google.com/p/angleproject
  • 谢谢。我在下面回复了你和 einSelbst 的 cmets。
  • 嗨 Sharoz,实际上我自己在 Angle 邮件列表中提出了一个问题 - 我从 Daniel Koch 那里得到了答复,说他们已经研究了 VTU,但到目前为止还没有实施。您在下面是正确的,只有 D3D9 HSLS V 3+ 支持顶点纹理着色器。默认情况下,FF 只是刚刚切换到 Angle。我决定看看能不能抽出时间来看看 Angle 的实现,也许可以提出一个补丁,但是有一些问题。
  • 糟糕,我刚看到这条评论。感谢您查看这个!我会查看 Angle 邮件列表。
【解决方案2】:

它想评论,但我没有声望。

正如 alanatmech 所说,它可能与 Angle 有关,它将所有 GL 调用转发到 DirectX。 因此,在没有 OpenGL 驱动程序的 Windows 机器上支持 WebGL 并不是一项功能下降,其好处是。

您可以尝试使用“--use-gl=desktop”运行 Chrome,因此它将使用 OpenGL 渲染后端而不是 Angle。 您的网站不适用于我使用 Chrome 8.0.552.215 测试版,但它没有给出您提到的错误,我确实在没有标志和 Minefield 的 Chrome 9.0.597.10 金丝雀版本上得到了。

【讨论】:

  • 我没有意识到它正在使用 DX。显然,DX9 的较旧(或更有限)变体无法进行顶点纹理调用 (en.wikipedia.org/wiki/Shader_Model_3#Vertex_shader_comparison)。有趣的是它可以在 Firefox 4 中运行。也许他们使用的是不同版本的 Angle?或者也许 Firefox 正在通过 opengl 路由它?
  • 只有 Chrome 使用 Angle(目前)。 Firefox 4(Beta 7)仍在使用 OpenGL。我的猜测是它只是没有实现。
  • 自 12 月 4 日起,它(Angle/D3D)在 32 位窗口的 firefox nightlies 中默认启用,我猜 beta8pre 也是。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多