建议在openGL ES2.0中进行矩阵变换的最佳方法?

时间:2014-08-27 10:29:01

标签: performance opengl-es opengl-es-2.0 vertex-shader

我正在开发一个OpenGLES2.0 application.Time来呈现应用程序对我来说至关重要。我的应用程序同时具有静态和动态对象(在拨号中移动指针)。为了提高性能我想减少计算负担中央处理器。我想在着色器本身计算转换矩阵(转换,旋转,缩放),而不是在CPU上计算它们(仅适用于动态对象)。建议这样做以提高性能吗?

我的顶点着色器会看起来这个

vertex .c

int main() 
{

  if(static==0)   //for static rendering. Value sent from the app 
{
   gl_Position = mvp* vec4(vert,1.0); // MVP is calculated in the app and sent to shader 

}

  if(static==1) // for dynamic objects. Value sent from the app
{
 /* compute translated matrix
 /* Compute rotated matrix
 /* compute scaled matrix

  gl_Postion = mvp*vec4(vert,1.0); /* mvp is calculated in the shader 

}

}

只有在动态对象的情况下,计算负担才会在GPU而不是CPU上。这样可以缩短渲染应用程序的时间吗?我需要一个更好的FPS。

1 个答案:

答案 0 :(得分:0)

一般来说,你的问题没有确切的答案,因为它真的取决于很多因素。例如,粒子系统往往非常昂贵,因为许多计算通常在着色器内完成。因此,如果您想生成数百个粒子,最好为CPU上的动态对象计算mvp矩阵,以免更多地消耗GPU。

基本上,您应该在CPU上的应用程序处理和GPU上的OpenGL ES处理之间找到平衡点,并且应该考虑将来要在应用程序中呈现的内容,有多少等...

但是有一些很棒的技巧可以帮助您优化着色器: Best practices for shaders

有趣的部分从“尊重着色器的硬件限制”开始到底部。您的着色器中可以改进的一些事项:

  • 在着色器中使用常量而不是立即值,尤其是如果您使用相同的立即值几次 - 代码可能不太可读,但肯定更有效。例如:在main()上面创建一个const :

    const float ONE = 1.0;
    

并使用它而不是直接的1.0值。

  • 分支和条件效率低下,因此最好将着色器拆分为2个单独的着色器:

对于静态渲染:

    void main()
    {
        gl_Position = mvp* vec4(vert,1.0);
    }

用于动态渲染:

    void main()
    {
        /* compute translated matrix
        /* Compute rotated matrix
        /* compute scaled matrix
        gl_Position = mvp* vec4(vert,1.0);
    }