【问题标题】:OpenGL ES 2.0 draw Fullscreen Quad very slowOpenGL ES 2.0 绘制 Fullscreen Quad 非常慢
【发布时间】:2014-03-21 14:51:58
【问题描述】:

当我将我的内容渲染到绑定了纹理的 FBO 上,然后使用基本着色器将此绑定的纹理渲染到全屏四边形时,性能下降得离谱。

例如:

直接渲染到屏幕(使用基本着色器):

当首先渲染到纹理时,然后用全屏四边形渲染纹理:(使用相同的基本着色器,通常会像模糊或绽放):

有人知道如何加快速度吗?由于目前的性能不可用。此外,我使用GLKit 来处理基本的 OpenGL 内容。

【问题讨论】:

  • 我没有看到任何性能下降。如果您在全屏上渲染,这通常是片段着色器使用的影响,这会花费额外的时间进行渲染。想象一下,你的 GPU 计算每个片段的颜色(通常是像素)。如果碎片更少,那么它会绘制得更快。
  • 是的,我知道,但我已经尽可能少做(见这里:shaders
  • 精确尝试pastebin.com/jafdRryk
  • 哇,已经做了很多没有明显差异的事情 (image)。我认为这是尽可能接近的,因为它必须将所有内容渲染两次。您可以将其发布为答案,如果您愿意,我可以接受:)

标签: ios objective-c opengl-es opengl-es-2.0 glkit


【解决方案1】:

需要在需要的地方使用精度。
lowp - 用于颜色、纹理坐标、法线等。
highp - 对于矩阵和顶点/位置
Quick reference,检查精度范围,在“限定符”的第 3 页上。

//  BasicShader.vsh
precision mediump float;

attribute highp vec2 position;
attribute lowp vec2 texCoord;
attribute lowp vec4 color;

varying lowp vec2 textureCoord;
varying lowp vec4 textureColor;

uniform highp mat4 projectionMat;
uniform highp mat4 worldMat;

void main() {
    highp mat4 worldProj = worldMat * projectionMat;
    gl_Position = worldProj * vec4(position, 0.0, 1.0);
    textureCoord = texCoord;
    textureColor = color;
}

//  BasicShader.fsh
precision mediump float;

varying lowp vec2 textureCoord;
varying lowp vec4 textureColor;

uniform sampler2D sampler;

void main() {
    lowp vec4 Color = texture2D(sampler, textureCoord);
    gl_FragColor = Color * textureColor;
}

【讨论】:

  • 感谢您完成了大部分工作。但我认为我一直忘记我没有电脑的力量:D screeny 猜我不能拥有一切
【解决方案2】:

这很可能是由性能不佳的 openGL ES API 调用引起的。

您应该连接一个真实设备并进行 openGL ES 帧捕获。 (确实需要真机,模拟器没有抓帧选项)。

帧捕获将指示内存和其他警告以及在每个 API 调用旁边修复它们的建议。逐步完成这些并修复每个。性能应该会大大提高。

这里有几个参考来完成这项工作:

【讨论】:

  • 是的,我从 OpenGL 调试器中获得了这个屏幕截图,并附有 iPad 3(因为该功能在模拟器上不可用)。它向我显示的唯一警告是我没有使用 VAO,因为我正在绘制精灵并且它们每帧都会改变。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多