Autor Wątek: [OpenGL] Zły shader? Problem z wyświetlaniem obrazka  (Przeczytany 1877 razy)

Offline NPS

  • Użytkownik

# Styczeń 23, 2010, 21:23:08

Mam sobie jakieś tło i przeźroczysty obrazek (oba zapisane w png), który chcę wyświetlić na tym tle. Obrazek widać na 1. Efekt powinien być jak na 3 (w Photoshopie, gdy nałożę na siebie warstwy, efekt jest dobry). Ale w programie (OpenGL, GLSL, tło i obrazek wyświetlane jako tekstury na QUAD-zie) - efekt jest jak na 2.

Nie wiem nawet, czego to wina. Może shadera:
uniform sampler2D texture;

void main()
{
    gl_FragColor = texture2D(texture, gl_TexCoord[0].xy);
}
Może czegoś innego. Jakieś pomysły?

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Avaj

  • Użytkownik

# Styczeń 23, 2010, 21:26:15
wklej kod gdzie ustawiasz tryb blendingu, tam się wszystko dzieje ważne

Offline NPS

  • Użytkownik

# Styczeń 23, 2010, 21:33:57
To? (W Javie piszę, stąd to "gl.").
    public void init(GLAutoDrawable drawable)
    {
        for (int i = 0 ; i < 256 ; ++i)
        {
            keys[i] = false;
        }
        gl = drawable.getGL();
        gl.setSwapInterval(0);
gl.glShadeModel(gl.GL_SMOOTH);
gl.glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
gl.glClearDepth(1.0);
gl.glEnable(gl.GL_DEPTH_TEST);
gl.glDepthFunc(gl.GL_LEQUAL);
gl.glHint(gl.GL_PERSPECTIVE_CORRECTION_HINT, gl.GL_NICEST);
        gl.glEnable(gl.GL_CULL_FACE);
        gl.glEnable(gl.GL_BLEND);
        gl.glBlendFunc(gl.GL_SRC_ALPHA, gl.GL_ONE_MINUS_SRC_ALPHA);
        game.init(drawable);
    }

Shader w pierwszym poście to fragment shader, w vertex shaderze chyba (?) nie dzieje się nic, co by miało na to wpływ.
« Ostatnia zmiana: Styczeń 24, 2010, 14:39:41 wysłana przez NPS »

Offline Avaj

  • Użytkownik

# Styczeń 23, 2010, 21:43:05
hmm. jak dla mnie wygląda ok. może twój loader tekstur coś miesza, np próbuje być cwany i robi premultiplied alpha (mnoży kolor przez alfę co mogłoby przyciemnić te twoje piksele)

Offline NPS

  • Użytkownik

# Styczeń 23, 2010, 21:58:56
Korzystam z klas com.sun.opengl.util.texture.Texture (do przechowywania i zarządzania teksturą) i com.sun.opengl.util.texture.TextureIO (do wczytywania tekstury - funkcja newTexture()).

Offline NPS

  • Użytkownik

# Styczeń 24, 2010, 13:57:25
Żadnych pomysłów?

Vipa

  • Gość
# Styczeń 24, 2010, 14:07:07
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_ALPHA_TEST);
glAlphaFunc(GL_GREATER, 0);
... // wyswietl ten polprzezroczysty
glDisable(GL_BLEND);
glDisable(GL_ALPHA_TEST);

A w ten sposób?

Offline Hiwer

  • Użytkownik

# Styczeń 24, 2010, 14:15:54
Jak dla mnie to wygląda tak (patrząc na obrazek 3), jakbyś chciał zrobić addytywne dodanie tej nowej warstwy zamiast mieszać kanały alpha.

Offline NPS

  • Użytkownik

# Styczeń 24, 2010, 15:00:25
Vipa, nie pomogło.

Vipa

  • Gość
# Styczeń 24, 2010, 15:02:31
Mój błąd sorry. Tzn. działało by, gdybyś wyświetlił ten drugi (półprzezroczysty) ciut wyżej i bez shadera :D. Oczywiście jeżeli plik z grafiką ma kanał alpha.

Offline NPS

  • Użytkownik

# Styczeń 24, 2010, 15:57:42
Co znaczy "wyświetlił ciut wyżej"?

Offline .:NOXY:.

  • Użytkownik
    • Profil

# Styczeń 24, 2010, 16:09:00
A nie lepiej po prostu wlaczyc sam bleding i polaczyc te textury w shaderze?

Offline raver

  • Użytkownik
    • Moja strona domowa.

# Styczeń 24, 2010, 17:59:15
Wszystko jest dobrze, tylko musisz zwiększyć wartość alpha w tym obrazku na tej poświacie
lub zastosować blending addytywny:
glBlendFunc(GL_ONE, GL_ONE);
zamiast
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
pozdrawiam

EDIT: Podany przeze mnie drugi sposób nie daje oczekiwanych rezultatów, zasugerowałem się postem Hiwera
« Ostatnia zmiana: Styczeń 24, 2010, 19:12:41 wysłana przez raver »

Offline NPS

  • Użytkownik

# Styczeń 24, 2010, 21:07:10
Wygląda na to... że plik z grafiką nie ma kanału alpha. :P W Photoshopie jest przeźroczysty, w innych programach, jak otwieram, też. Ale w Photoshopie w kanałach jest tylko R, G i B, Alpha nie ma. :P

Edit: Nie wie ktoś, jak w Photoshopie zapisać ten obrazek z kanałem alpha?
« Ostatnia zmiana: Styczeń 24, 2010, 23:43:15 wysłana przez NPS »

Vipa

  • Gość
# Styczeń 25, 2010, 18:35:36
Zapisz jako format png. Tam gdzie rysunek ma być prześwitujący, tam ma być ustawiona alpha.

Jeżeli to ma być 2D, to zastosuj moją metodę opisaną wcześniej. Bez shadera. Na pierwszy wyłącz w ogóle blending, i drugi narysuj tak jak pisałem.

Będzie grać.