Можете ли вы иметь несколько пиксельных (фрагментных) шейдеров в одной программе?

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

3 ответа

Решение

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

main() {
    callToShaderObject1()
    callToShaderObject2()
}

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

Они не могут работать одновременно, но вы можете использовать разные шейдеры для разной геометрии или выполнять рендеринг в несколько проходов, используя разные шейдеры.

Ответ зависит от версии GL, нужно проверитьglAttachShaderдокументацию для версии, которую вы используете. Версии GLES (включая webgl) не позволяют присоединять несколько фрагментных шейдеров к одной программе и при попытке вызвать ошибку GL_INVALID_OPERATION.

glAttachShader — OpenGL 4 :

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

glAttachShader — OpenGL ES 3.2 :

Не допускается присоединение нескольких шейдерных объектов одного типа.

Другие вопросы по тегам