Почему поиск текстур OpenGL ES так сильно меняется при разных координатах (КАК от вершинного шейдера)?

#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, потому что я использую соответствующие текстуры в качестве плитки для рельефа.