Недавно я прочитал (впервые), что передача массива с текстурными координатами во фрагментный шейдер для многократного поиска сэмплера намного быстрее, чем их вычисление во фрагментном шейдере, потому что opengl может предварительно выбрать эти пиксели. Это правда ? Если да, то каковы ограничения? Должен ли я сообщить opengl, что эти координаты будут использоваться как texCoords?
Повышает ли вычисление координат текстуры в вершинном шейдере производительность в GLSL?
Ответы (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, что координаты будут использоваться как координаты текстуры.
in float[9] texCoords; [...] gl_FragColor = texture2d(tex, texCoords[0]);
? (PS: ЧТО F не так с форматированием этих комментариев?
- person pixartist; 18.08.2014
vec2
в texture2D
. Не могу помочь с форматированием комментариев :-)
- person GuyRT; 19.08.2014