#performance #opengl-es #coordinates #textures #lookup
#Производительность #opengl-es #координаты #Текстуры #поиск
Вопрос:
Я разрабатываю игру для Android с OpenGL ES 2.0. Мне нужно получить доступ к 4 различным текстурным картам в шейдере фрагментов, чтобы применить мультитекстуру к местности (разбрызгивание текстур). Проблема, с которой я сталкиваюсь, заключается в том, что доступ к одним и тем же текстурным картам с разными координатами дает на выходе разницу почти в 10 кадров в секунду. Обе координаты вычисляются в вершинном шейдере, в фрагментном шейдере есть только поиск текстуры. Я не могу объяснить такую огромную разницу в производительности.
Вершинный шейдер
...
varying vec2 vTextureCoordinates;
varying vec2 vTextureCoordinates2;
void main() {
...
vTextureCoordinates = textureCoordinates;
vTextureCoordinates2 = textureCoordinates * 16.0;
...
gl_Position = MVPMatrix * position;
}
Фрагментный шейдер
...
uniform sampler2D textureBlack;
uniform sampler2D textureRed;
uniform sampler2D textureGreen;
uniform sampler2D textureBlue;
uniform sampler2D blendMap;
varying vec2 vTextureCoordinates;
varying vec2 vTextureCoordinates2;
void main() {
...
vec4 blendColor = texture2D(blendMap, vTextureCoordinates);
float black = 1.0 - (blendColor.r blendColor.g blendColor.b);
// 28 FPS -> OK
// vec4 blackColor = texture2D(textureBlack, vTextureCoordinates) * black;
// vec4 redColor = texture2D(textureRed, vTextureCoordinates) * blendColor.r;
// vec4 greenColor = texture2D(textureGreen, vTextureCoordinates) * blendColor.g;
// vec4 blueColor = texture2D(textureBlue, vTextureCoordinates) * blendColor.b;
// 20 FPS!!!
vec4 blackColor = texture2D(textureBlack, vTextureCoordinates2) * black;
vec4 redColor = texture2D(textureRed, vTextureCoordinates2) * blendColor.r;
vec4 greenColor = texture2D(textureGreen, vTextureCoordinates2) * blendColor.g;
vec4 blueColor = texture2D(textureBlue, vTextureCoordinates2) * blendColor.b;
vec3 fragColor = vec3(blackColor redColor greenColor blueColor);
Комментарии:
1. Я предполагаю, что vTextureCoordinates2 находятся вне диапазона [0 ..1,0 ..1], поэтому Texture2D выполняет дополнительный алгоритм экстраполяции / интерполяции. Это может быть лучший способ изменить текстуры, а затем манипулировать с координатами.
2. Также вы можете пересчитать координаты текстуры в диапазоне [0 ..1,0 ..1] в вершинном шейдере. Вы выиграете в производительности, потому что фрагментный шейдер выполняется чаще.
3. Хотя
28 FPS
раздел закомментирован,vTextureCoordinates
он все еще используется дляblendColor
поиска текстуры. Но если вы используетеvTextureCoordinates
оба поиска, компилятор шейдеров сможетvTextureCoordinates2
полностью оптимизировать работу, в результате чего между вершинным и фрагментным шейдерами будет передаваться меньше данных. Чтобы проверить, так ли это, попробуйте и посмотрите, что произойдет, если выvTextureCoordinates2
blendColor
также используете for the.4. Привет, Хихикомори, да, то, что вы сказали, тоже было моей мыслью. Тем не менее, опять же, это кажется абсурдным увеличением fps только по этой причине; т. Е. Добавление вычислений нормального отображения к фрагментному шейдеру не дало такого увеличения. Координаты были умножены на 16, потому что я использую соответствующие текстуры в качестве плитки для рельефа.