Skocz do zawartości
  • Ogłoszenia

  • Gdzie świętować urodziny GMCLANu   31 użytkowników zagłosowało

    1. 1. Gdzie świętować urodziny GMCLANu


      • Warszawa (bo w centrum)
      • Szczecin (bo tam mieszka Ranma i narodził się GMCLAN)

    Żeby zagłosować w tej ankiecie, prosimy się zalogować lub zarejestrować. Zobacz temat
  • 0
Hawaxi

samoczynna zmiana przezroczystości na kolor czarny

Pytanie

Witam,

Podczas eksportowania projektu do ios'a, przezroczyste tło w gifach staje się czarne. Jest to wina shaderów zmieniających hue owych gifów(gdy je usuwam tło staje się przezroczyste i wszystko działa poprawnie). Natomiast przy tworzeniu aplikacji na windowsa lub inna platformę problem ten nie występuje. Spotkaliście się z podobną komplikacją? Jakieś pomysły?

 

Próbowałem usunąć kolor czarny w kodzie shaderu, wystąpił ten sam problem.

kod:

if(vec3(gl_FragColor) == vec3(0.0))
gl_FragColor.a = 0.0;

 

Proszę o szybką pomoc.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

8 odpowiedzi na to pytanie

Rekomendowane odpowiedzi

  • 0

@Hawaxi

pierwsza rzecz, jaka przychodzi mi na myśl to:

// calculate saturation of color.
float sat = dot(gl_FragColor.rgb, vec3(1.0));
// calculate alpha boolean filter (we get 1.0 only if saturation is not zero).
float f = step(0.004, sat); // 1 divided by 255 is ~0.004.
// multiply alpha by boolean filter to make black color fully transparent.
gl_FragColor.a *= f;

Przetestowałem lokalnie i działa - sprawdź jak na iOSie się to zachowuje. W razie czego zwiększ 0.004 i zobacz, na jakiej wartości iOS usuwa czarny.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0

w gifach ? przecież GM powinien operować na PNG.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0

@gnysek: wewnetrznie tak, on po prostu uzyl gifow do animacji poklatkowej. tak czy inaczej to ze to gif to nie powod do powstania tego bledu, a sam shader zmiany wartosci hue, ktory totalnie olewa transparentnosc w tej kwestii. najlepiej, jakby kolega wrzucil kod calego shadera, to moznaby go przerobic zeby nie olewal alphy, ale poki co to mysle ze moje rozwiazanie styknie :P

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0

Może trzeba zrobić "premultiply-alpha" ?

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0
5 minut temu, gnysek napisał:

Może trzeba zrobić "premultiply-alpha" ?

to nadal nic nie zmieni - kolega napisal, ze alpha dziala jesli wylaczy ten shader zmiany hue. problem totalnie siedzi w kodzie shadera, ktory olewa alphe zrodlowa :P

inny problem jaki widze potencjalnie, to to ze tekstury budowane dla iOS sa kompresowane i to moze byc takze problemem bo alpha wtedy ma strasznie slaba jakosc. nie wiem, czy mozna wylaczyc kompresje konkretnym teksturom w GMie, wiec zobaczymy czy pierwsze rozwiazanie zadziala - jak nie to kminimy dalej z kompresja.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0

Próbowałem na wszelkie sposoby zmodyfikować kod niestety nic to nie dało, walcze dalej. Ktoś ma inne pomysły?

 

Podsyłam kod shaderu, może uda się komuś coś zdziałać.

varying vec2 v_vTexcoord;
varying vec4 v_vColour;
uniform float Position;
vec3 rgb2hsv ( vec3 color )
{
    vec4 K = vec4 ( 0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0 );
    vec4 p = mix ( vec4 ( color.bg, K.wz ), vec4 ( color.gb, K.xy ), step ( color.b, color.g ) );
    vec4 q = mix ( vec4 ( p.xyw, color.r ), vec4 ( color.r, p.yzx ), step ( p.x, color.r ) );
    float d = q.x - min ( q.w, q.y );
    float e = 1.0e-10;
    return vec3 ( abs ( q.z + ( q.w - q.y ) / ( 6.0 * d + e ) ), d / ( q.x + e ), q.x );
}
vec3 hsv2rgb ( vec3 hsv )
{
    vec4 K = vec4 ( 1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0 );
    vec3 p = abs ( fract ( hsv.xxx + K.xyz ) * 6.0 - K.www );
    return hsv.z * mix ( K.xxx, clamp ( p - K.xxx, 0.0, 1.0 ), hsv.y ); 
}
void main ( )
{
    gl_FragColor = texture2D ( gm_BaseTexture, v_vTexcoord ) * v_vColour;
    
    vec3 hsv = rgb2hsv ( gl_FragColor.rgb );                                                                                                                                                                                                                                             
    vec3 shifted_color = vec3 ( hsv.x + Position, hsv.y, hsv.z);
    gl_FragColor.rgb = hsv2rgb ( shifted_color );
    gl_FragColor *= v_vColour;
}

 

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0

Problem rozwiązany,

wystarczyło discardować pixele z alphą <= 0, może nie jest to wydajne rozwiązanie ale działa.

    if (gl_FragColor.a <= 0.0) {
    discard;
    }

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0

czyli byl bledny blending! :D

  • Super (+1) 1

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się tutaj.

Zaloguj się tutaj

  • Przeglądający   0 użytkowników

    Brak zarejestrowanych użytkowników, przeglądających tę stronę.

×