我什么时候应该停止使GLSL-ES着色器复杂化并开始将它们分成更小,更简单的着色器?

时间:2011-11-22 13:02:15

标签: opengl-es glsl shader

如果只是简单地切换程序而不是使用大而复杂的着色器,我在查找本主题中的信息时遇到了麻烦?

有人告诉我,即使是简单的IF声明也可能是预先计算该条件并相应选择程序的理由。

我可以阅读这个或任何“GLSL-ES中的良好实践”一书/教程的任何帮助吗?

1 个答案:

答案 0 :(得分:2)

这几乎取决于你的意思。

着色器程序中的分支会影响GPU术语的性能:如果你的顶点数组非常长,我会避免分支;而是使用预处理器并链接多个不同的程序。

使用单复杂的大型着色器程序可提高CPU性能:每个 glUseProgram 需要时间,您可能只需要调用一次(至少更少)。

CPU优势是否优于GPU优势?回答这个问题可以回答你的问题。

...

就个人而言,我选择了预处理器,并且为了基本目的而避免分支。每个着色器程序都有明确定义的接口,不同的对象实现它们;附加不同的对象完成程序实现。

实现#include指令有很大帮助。通用声明包含在不同的对象中,只有静态访问的属性和制服才能有效地链接到程序中。

这是我的着色器程序的一个例子:

#include </Derm/Shaders/IProjectVertex>
#include </Derm/Shaders/Compatibility>

#include </Derm/Shaders/Standard/ShaderInputs>
#include </Derm/Shaders/Standard/IColorVertex>

// --- Vertex shader outputs

// This shader output interface
BEGIN_OUTPUT_BLOCK(FragmentShaderVaryings)
    // Processed vertex color
    vec4        ds_Color;
    // Processed vertex texture coordinate
END_OUTPUT_BLOCK()

// Vertex shader entry point
void main()
{
    // Compute transformed vertex position
    gl_Position = ProjectVertexPosition(ds_VertexPosition);

#if defined(DS_COLOR_PER_VERTEX)
    // Support vertex color
    ds_Color = ComputeVertexColor();
#endif

    // Support vertex texturing
#if defined(DS_TEXTURE)
    ds_TexCoords = ds_VertexTexCoord;
#endif
}