我想實現在OpenGL ES2.0的iOS二維輪廓着色器。它非常緩慢。如在5fps緩慢。我跟蹤到了texture2D()調用。但是,沒有那些卷積着色器是可撤銷的。我嘗試過使用lowp而不是中性,但是一切都是黑色的,儘管它確實給出了5fps,但仍然無法使用。簡單GLSL卷積着色器是殘暴慢
這是我的片段着色器。
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方式中更多的參與效果運行沒有問題。我看不出爲什麼這會造成任何麻煩。
「*我試過用純粹的vec4替換了循環中的texture2D()調用,它沒有問題*」這是什麼意思?它變快了嗎?它沒有改變性能?發生了什麼? –
「*我看不出爲什麼這會導致任何麻煩。*」您正在執行每個着色器調用的* 10次紋理訪問,並且您沒有看到可能導致問題的原因?此外,您訪問中心texel兩次。 –
沒有紋理查找,我得到了穩定的60fps(不包括最後一個)。正如我所說,它沒有優化,但沒有辦法避免這些紋理調用。否則,過濾器無法工作。但是我看到很多遊戲,移動和不是,使用基於卷積過濾器的效果,而且他們似乎沒有任何問題。除非有一些竅門可以避免它們? – user1137704