Повышает ли вычисление координат текстуры в вершинном шейдере производительность в GLSL?

Недавно я прочитал (впервые), что передача массива с текстурными координатами во фрагментный шейдер для многократного поиска сэмплера намного быстрее, чем их вычисление во фрагментном шейдере, потому что opengl может предварительно выбрать эти пиксели. Это правда ? Если да, то каковы ограничения? Должен ли я сообщить opengl, что эти координаты будут использоваться как texCoords?


person pixartist    schedule 17.08.2014    source источник


Ответы (1)


Как и в случае с большинством вопросов о производительности, ответ зависит от реализации OpenGL. Я знаю по крайней мере одну реализацию, в которой есть эта оптимизация, и одну, в которой ее нет.

В известных мне реализациях предварительная выборка происходит только в том случае, если вы используете ввод фрагментного шейдера (то есть переменную, объявленную с помощью varying или in) непосредственно в качестве аргумента функции текстуры. Так:

in vec2 tex_coord;

main()
{
    gl_FragColor = texture( diffuse_texture, tex_coord );
}

подходит, но:

    gl_FragColor = texture( diffuse_texture, 0.5 * tex_coord + 0.5 );

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

    vec2 tex_coord2 = texture( offset_texture, tex_coord ).rg;
    gl_FragColor = texture( diffuse_texture, tex_coord2 );

Теперь поиск второй текстуры не может произойти, пока не завершится первый.

Вам не нужно сообщать OpenGL, что координаты будут использоваться как координаты текстуры.

person GuyRT    schedule 18.08.2014
comment
А как насчет in float[9] texCoords; [...] gl_FragColor = texture2d(tex, texCoords[0]); ? (PS: ЧТО F не так с форматированием этих комментариев? - person pixartist; 18.08.2014
comment
Я не думаю, что это должно иметь значение, что это массив (на самом деле это догадки о том, что делает какая-либо конкретная реализация) - хотя вы должны передавать vec2 в texture2D. Не могу помочь с форматированием комментариев :-) - person GuyRT; 19.08.2014