2017-05-05 5 views
0

ich ein Spiel für Android schreibe mit Love2D in dem ich eine Gaußsche Unschärfe Shader mit einer Bloom-Effekt zu bekommen, aber ich es auf dem PC am Testen und die Ergebnisse auf dem PC und Android sind sehr anders, bis zu dem Punkt, den Shader auf Android nutzlos zu machen.Gaussian Blur Shader weniger intensiv auf Android

Hier ist, wie die PC-Version wie folgt aussieht: Running on my PC

Und hier ist, wie die Android-Version wie folgt aussieht: Running on android

Sowohl mit den folgenden Shadern laufen, mit Versatzrichtung einen Pass zu tun vertikaler und horizontal.

// Vertex Shader: 
#ifdef GL_ES 
#ifdef GL_FRAGMENT_PRECISION_HIGH 
precision highp float; 
#else 
precision mediump float; 
#endif 
#endif 

varying vec2 coordinate2b; 
varying vec2 coordinate1b; 
varying vec2 coordinate0f; 
varying vec2 coordinate1f; 
varying vec2 coordinate2f; 

uniform vec2 offset_direction; 

vec4 position(mat4 transform_projection, vec4 vertex_position) 
{ 
    coordinate2b = VertexTexCoord.xy + -3.230769 * offset_direction; 
    coordinate1b = VertexTexCoord.xy + -1.384615 * offset_direction; 
    coordinate0f = VertexTexCoord.xy + 0.000000 * offset_direction; 
    coordinate1f = VertexTexCoord.xy + 1.384615 * offset_direction; 
    coordinate2f = VertexTexCoord.xy + 3.230769 * offset_direction; 
    return transform_projection * vertex_position; 
} 

// Fragment Shader: 
#ifdef GL_ES 
#ifdef GL_FRAGMENT_PRECISION_HIGH 
precision highp float; 
#else 
precision mediump float; 
#endif 
#endif 

varying vec2 coordinate2b; 
varying vec2 coordinate1b; 
varying vec2 coordinate0f; 
varying vec2 coordinate1f; 
varying vec2 coordinate2f; 

vec4 effect(vec4 color, Image texture, vec2 texture_coords, vec2 screen_coords) 
{ 
    vec4 c = vec4(0.0); 
    c += vec4(0.070270) * Texel(texture, coordinate2b); 
    c += vec4(0.316216) * Texel(texture, coordinate1b); 
    c += vec4(0.227027) * Texel(texture, coordinate0f); 
    c += vec4(0.316216) * Texel(texture, coordinate1f); 
    c += vec4(0.070270) * Texel(texture, coordinate2f); 
    return c * color; 
} 

ich zur Zeit das Problem bin zu raten, ist mit float Präzision, aber ich bin nicht sicher, was ich tun würde, muss das zu beheben.

+0

Was ist der Wert von offset_direction auf jeder Plattform? Ich nehme an, es hängt mit der Bildschirmauflösung zusammen, stimmen also die Bildschirmauflösungen überein? – Columbo

+0

Es ist eigentlich das gleiche in beiden, da ich die Szene auf eine Zwischen Leinwand rendert und dann diese Leinwand auf die Bildschirmgröße skalieren –

+0

Ist es möglich, die Textur-Filterung Einstellungen sind unterschiedlich? (d. h. lineare Filterung ist auf dem PC aktiviert, aber auf Android deaktiviert) – Columbo

Antwort

0

Dank Columbo habe ich zwei verschiedene Probleme beim Ausführen des Spiels auf meinem Android gefunden. Erstens war die Texturfilterung nicht linear, was dazu führte, dass die Skalierungsoptimierung nicht funktionierte und seltsame Probleme mit der Skalierung hatte. Zweitens, love2d für Android unterstützt keine Gammakorrektur, also lief das Spiel beim Ausführen auf meinem Handy nicht korrekt und die Unschärfe war aufgrund des dunklen Hintergrunds nicht sichtbar.

Immer auf Gammakorrektur prüfen!