Я пытаюсь реализовать 2D контурный шейдер в OpenGL ES2.0 для iOS. Это безумно медленно. Как в 5fps медленно. Я отследил его до вызовов texture2D(). Тем не менее, без них любой сверточный шейдер отменяется. Я пробовал использовать lowp вместо mediump, но при этом все просто черное, хотя оно дает еще 5 кадров в секунду, но оно все еще непригодно.
Вот мой шейдер фрагмента.
varying mediump vec4 colorVarying;
varying mediump vec2 texCoord;
uniform bool enableTexture;
uniform sampler2D texture;
uniform mediump float k;
void main() {
const mediump float step_w = 3.0/128.0;
const mediump float step_h = 3.0/128.0;
const mediump vec4 b = vec4(0.0, 0.0, 0.0, 1.0);
const mediump vec4 one = vec4(1.0, 1.0, 1.0, 1.0);
mediump vec2 offset[9];
mediump float kernel[9];
offset[0] = vec2(-step_w, step_h);
offset[1] = vec2(-step_w, 0.0);
offset[2] = vec2(-step_w, -step_h);
offset[3] = vec2(0.0, step_h);
offset[4] = vec2(0.0, 0.0);
offset[5] = vec2(0.0, -step_h);
offset[6] = vec2(step_w, step_h);
offset[7] = vec2(step_w, 0.0);
offset[8] = vec2(step_w, -step_h);
kernel[0] = kernel[2] = kernel[6] = kernel[8] = 1.0/k;
kernel[1] = kernel[3] = kernel[5] = kernel[7] = 2.0/k;
kernel[4] = -16.0/k;
if (enableTexture) {
mediump vec4 sum = vec4(0.0);
for (int i=0;i<9;i++) {
mediump vec4 tmp = texture2D(texture, texCoord + offset[i]);
sum += tmp * kernel[i];
}
gl_FragColor = (sum * b) + ((one-sum) * texture2D(texture, texCoord));
} else {
gl_FragColor = colorVarying;
}
}
Это неоптимизировано и не завершено, но мне нужно повысить производительность, прежде чем продолжить. Я попытался заменить вызов texture2D() в цикле с помощью только сплошного vec4, и он не запускает никаких проблем, несмотря на все остальное.
Как я могу это оптимизировать? Я знаю, это возможно, потому что я видел, как больше задействованных эффектов в 3D работает без проблем. Я не понимаю, почему это вызывает какие-либо проблемы.