【问题标题】:How to sample large texture in OpenGL ES 2.0 for Android如何在 Android 的 OpenGL ES 2.0 中对大纹理进行采样
【发布时间】:2012-11-09 20:29:43
【问题描述】:

我现在正在尝试使用片段着色器来处理纹理上的图像。但是,我发现片段着色器仅支持 10 位浮点数,因此当屏幕长度为 1280 像素时,我无法获取存储在像素中的值,因为我无法使用 10 位来采样 1280 像素.

我想知道如何准确地获取大纹理上的像素?

【问题讨论】:

  • 您有什么证据表明某些支持 GLSL 的硬件只能提供 10 位的精度?这是什么硬件?
  • 我使用函数glGetShaderPrecisionFormat检查了设备以测试对GLES20.GL_HIGH_FLOAT的支持,但发现硬件不支持它。这意味着设备不支持highp的精度。更多功能详情可查看khronos.org/opengles/sdk/docs/man/xhtml/…@NicolBolas

标签: android opengl-es-2.0 glsl


【解决方案1】:

浮点数有 3 种不同的精度格式。 OpenGL ES Shading Language reference 说:

  1. highp:16 位,浮点范围:-2^62 到 2^62,整数范围: -2^16 到 2^16
  2. mediump:10 位,浮点范围:-2^14 到 2^14,整数 范围:-2^10 到 2^10
  3. lowp:8 位,浮点范围:-2 到 2,整数范围:-2^8 到 2^8

为了能够从 >1024x1024 纹理进行采样,您必须将以下代码置于 GLSL 程序的开头,将精度切换为 highp

precision highp float;

【讨论】:

  • 其实我试过了但是发现设备不支持highp的精度。对此精度的支持是可选的。所以大多数移动设备的 GPU 不支持片段着色器的这种精度,因为通常这种大小的纹理被认为是不必要的。因此即使将这行代码添加到程序的开头,我仍然无法对纹理进行采样。还是谢谢大家。
  • 是否可以将纹理的大小减小到1024或将其拆分为多个纹理?
  • 事实上,我现在正在尝试将其拆分为多个纹理。但是我担心分割纹理会对程序的效率产生负面影响。我曾经尝试减小纹理的大小,但我发现大小为 1024 的纹理也太大了。我仍然不知道问题的原因。谢谢@Sergey K。
  • 谢谢你的提醒,我现在就接受。但是我还是怕分割贴图会导致效率的损失。 @Sergey K.
  • 看来是最好的选择了。
猜你喜欢
  • 2012-04-08
  • 1970-01-01
  • 2011-09-06
  • 1970-01-01
  • 2011-05-19
  • 2016-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多