【问题标题】:OpenGL ES 2.0: Is there a workaround for missing texture access in vertex shader?OpenGL ES 2.0:是否有解决顶点着色器中缺少纹理访问的方法?
【发布时间】:2013-01-22 16:12:29
【问题描述】:

我目前正在尝试一些带有 Android 的 OpenGL ES 2.0 游戏。我的地图是一个二维网格地图,每个位置都有一个高度值。现在我想将每个坐标的高度存储在纹理中,以便在顶点着色器中进行高度查找。

这个想法的好处是我可以生成一个通用的三角网并将它(带有偏移)放置在用户当前正在查看的地图的位置上。由于偏移,我可以省略每次用户移动其视图位置和我将从纹理中读取的高度轮廓时创建一个新三角网的需要。

现在存在的问题是许多当前的 Android 设备(甚至是 Galaxy S3)不支持顶点着色器中的纹理查找。可悲的是,这完全破坏了我目前的做法。

我的问题:在顶点着色器中是否还有其他可能从显卡内存中获取数据?在不直接指定每个顶点的数据的情况下,每次用户更改视图位置时,会迫使我(据我所知)重新创建高度图。 (每次用户更改视图位置时创建高度图会很慢......)

感谢您的帮助 + 最好的问候,

安德烈亚斯

【问题讨论】:

  • 我自己没有尝试在顶点着色器中进行纹理查找,但文档指出; 纹理查找函数可用于顶点着色器和片段着色器。 OpenGL ES 着色语言规范 1.00 rev 17。
  • 遗憾的是似乎有一个后门。请参阅此线程stackoverflow.com/questions/11398114/… 他们只是指定零 GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS。
  • 我通过输入图像像素作为顶点数据来解决这个限制when doing RGB histogram generation on iOS,但这在这里没有太大帮助。在您的情况下,仅发送顶点数据而不是尝试根据高度图转换顶点会不会有那么大的损失?

标签: android opengl-es-2.0 texture2d vertex-shader


【解决方案1】:

texture2DLod() 函数用于在顶点着色器中进行纹理查找。

请参阅GLSL ES specs8.7 纹理查找函数部分。

根据andy 的评论,在使用texture2DLod() 之前不要忘记检查GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS。如果不支持顶点纹理查找,您应该回退到另一个没有此功能的着色器。

【讨论】:

  • 问题是,即使是当前大多数高端智能手机也没有任何具有纹理访问的顶点着色器。因此,如果几乎没有设备可以使用它,那么在顶点着色器中使用纹理是没有意义的。
  • @andy 不幸的是,你是对的。这就是为什么如果你需要使用顶点纹理提取,你应该先检查GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS
  • @keaukraine 您实际上是在说“这个问题的答案是不要问这个问题”。这不是很有帮助:(。
猜你喜欢
  • 1970-01-01
  • 2016-05-04
  • 1970-01-01
  • 1970-01-01
  • 2012-02-21
  • 1970-01-01
  • 2014-06-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多