WebGL:顶点着色器中的纹理访问?

7
在WebGL中,能否在顶点着色器中从纹理中读取数据?
我写了一个WebGL页面(只是为了尝试一下),并使用Chrome 7进行了测试。但是当我升级到Chrome 8后,它就无法工作了。我再次确认webgl已启用。错误信息如下:

'texture2D': no matching overloaded function found

当我将texture2D的调用替换为常量时,它可以正常工作。使用相同纹理在片段着色器中访问纹理也可以正常工作。
有人有什么想法吗?我特别困惑的是升级Chrome后它就无法工作了。 更新:Firefox 4 beta可以正常工作。我向Chrome报告了一个bug - issue 65340 更新2:现在Firefox和Chrome都可以正常工作了。

我认为这可能是某些实现的限制。 - andrewmu
我怀疑这不是故意的。那将限制很多技术(例如位移映射)。 - sharoz
2个回答

6

这不是Chrome的一个真正的“bug”。

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

您可以使用Thatcher Ulrich的http://webgl-bench.appspot.com/来比较您的FF和Chrome版本。

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

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


那个网站很棒。谢谢。它在Chrome 7中实际上可以工作(我尝试了降级)。你有什么想法为什么他们会放弃这个功能吗?阻止硬件能力有什么好处吗? - sharoz
正如einSelbst在下面所说的那样,这不是一个“删除”功能的问题。Angle使用DX9来模拟Open GL ES 2.0,ES 2.0的最小顶点纹理计数为0。如果选择非Angle渲染器,则会使用底层图形卡的Open GL实现,该实现可能支持该功能。请注意,默认情况下,FF和Chrome都将使用Angle。我建议您查看Angle项目,也许问问他们是否想要实现顶点纹理支持。请参见http://code.google.com/p/angleproject/。 - alanatmech
谢谢。我已经回复了你和einSelbst在下面的评论。 - sharoz
1
嗨Sharoz,我在Angle邮件列表上提出了一个问题 - 我收到了Daniel Koch的答复,他说他们已经研究过VTUs,但迄今为止还没有实现。你下面说得对,只有D3D9 HSLS V 3+支持顶点纹理着色器。FF刚刚默认切换到Angle。我决定看看能否找到一些时间来查看Angle实现,并可能提出一个补丁,但存在一些问题。 - alanatmech
抱歉,我刚刚看到了这条评论。谢谢你关注这个问题!我会查看Angle邮件列表的。 - sharoz

2

我想发表评论,但我没有声望。

如alanatmech所说,这可能与Angle有关,它将所有GL调用转发到DirectX中。 因此,这不是一个特性的丢失,其好处是,在Windows机器上无需OpenGL驱动程序即可支持WebGL。

您可以尝试使用“--use-gl=desktop”运行Chrome,这样它将使用OpenGL渲染后端而不是Angle。 您的网站在我的Chrome 8.0.552.215 beta版本中也无法正常工作,但它没有给出您提到的错误;我在没有标志的Chrome 9.0.597.10 canary构建和Minefield上都会看到该错误。


我没有意识到它正在使用DX。显然,旧版(或更有限的)DX9无法进行顶点纹理调用(http://en.wikipedia.org/wiki/Shader_Model_3#Vertex_shader_comparison)。有趣的是它在Firefox 4中可以工作。也许他们正在使用不同版本的Angle?或者火狐浏览器通过OpenGL路由它? - sharoz
1
只有 Chrome 目前使用 Angle。Firefox 4(Beta 7)仍在使用 OpenGL。我猜这只是没有被实现。 - Gray
1
自12月4日起,Firefox夜间版32位Windows默认启用了Angle/D3D,我猜beta8pre也是如此。 - einSelbst

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接