我正在开发一个OpenGLES2.0 application.Time来呈现应用程序对我来说至关重要。我的应用程序同时具有静态和动态对象(在拨号中移动指针)。为了提高性能我想减少计算负担中央处理器。我想在着色器本身计算转换矩阵(转换,旋转,缩放),而不是在CPU上计算它们(仅适用于动态对象)。建议这样做以提高性能吗?
我的顶点着色器会看起来这个
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。答案 0 :(得分:0)
一般来说,你的问题没有确切的答案,因为它真的取决于很多因素。例如,粒子系统往往非常昂贵,因为许多计算通常在着色器内完成。因此,如果您想生成数百个粒子,最好为CPU上的动态对象计算mvp矩阵,以免更多地消耗GPU。
基本上,您应该在CPU上的应用程序处理和GPU上的OpenGL ES处理之间找到平衡点,并且应该考虑将来要在应用程序中呈现的内容,有多少等...
但是有一些很棒的技巧可以帮助您优化着色器: Best practices for shaders
有趣的部分从“尊重着色器的硬件限制”开始到底部。您的着色器中可以改进的一些事项:
在着色器中使用常量而不是立即值,尤其是如果您使用相同的立即值几次 - 代码可能不太可读,但肯定更有效。例如:在main()上面创建一个const :
const float ONE = 1.0;
并使用它而不是直接的1.0值。
对于静态渲染:
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);
}