Когда я должен прекратить усложнять шейдер GLSL-ES и начать разбивать их на более мелкие и простые? - PullRequest
2 голосов
/ 22 ноября 2011

У меня проблемы с поиском информации в этой теме, когда эффективнее просто переключать программы, чем иметь большой и сложный шейдер?

Кто-то сказал мне, что даже простое утверждение IF может быть причиной для пересчета этого условия и выбора программ соответственно.

Любую помощь с этой или любой книгой / учебником по "хорошим практикам в GLSL-ES", которую я могу прочитать?

1 Ответ

2 голосов
/ 23 ноября 2011

Это почти зависит от того, что вы имеете в виду.

Ветвление в шейдерной программе влияет на производительность в терминах GPU: если ваши массивы вершин очень длинные, я бы избегал ветвления;вместо этого используйте препроцессор и связывайте несколько разных программ.

Наличие одной шейдерной программы огромного размера повышает производительность процессора: каждая glUseProgram требует времени, и вы можете вызвать ее только один раз(хотя бы меньше).

Преимущества ЦП больше преимуществ ГП?Отвечая на этот вопрос, ответьте на ваш вопрос.

...

Лично я использую препроцессор и избегаю разветвлений в фундаментальных целях.Каждая шейдерная программа имеет четко определенные интерфейсы, и различные объекты реализуют их;присоединение различных объектов завершает реализацию программы.

Реализация директивы #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
}
...