[OpenGL]Włączanie przezroczystości przy nakładaniu tekstur

Witam,

mam pewien problem:

otóż wpadłem na genialny ( :stuck_out_tongue: ) pomysł jak zmieniać kolory autom w grze wyścigowej.

Ten ów genialny pomysł miał polegać na tym, że zrobię tekstury z elementami przezroczystymi (tj. robię np. światła, natomiast pole naokoło nich jest przezroczyste).

Tym sposobem chciałem właśnie zrobić coś takiego: w grze elementy przezroczyste chciałem zastąpić wygranym przez użytkownika kolorem :confused:

Niestety pomysł legnie w gruzach gdyż:

  • przezroczystości nie działają (tam gdzie miała być przezroczystość jest czarno)

  • gdy chcę zmienić kolor rysowania, zmienia się też kolor tekstur

oooonie.png

Moje pytania brzmią: czy coś da się z tym zrobić? Są jakieś inne sposoby, aby można było zmieniać kolor samochodu?

PS: Na screenie te żółte kropki i niebieski prostokąt to auto :stuck_out_tongue:

2 sposoby:

  1. Przez GLSL, gdzie w shaderze fragmentów odpowiednio mnożysz kolory

  2. Używając blendingu w funkcjach OpenGL bez GLSL

Prawdopodobnie tam u siebie nie włączyłeś mieszania z kanałem alpha, tzn. nie włączyłeś przeźroczystości. Upewnij się też, że do tekstury ładuje się z kanałem alpha (RGBA, ARGB, ABGR, czy któryś tam z A)

Włączenie blendingu i kanału alpha:

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

    glEnable( GL_BLEND );

OK. Przezroczystość jest :slight_smile:

Natomiast pozostaje kwestia wypełnienia miejsca przezroczystego wybranym kolorem…

Wybaczcie mi tutaj za moją niewiedzę, natomiast nie rozumiem tych 2 sposobów co mi podrzucił Razi.

Osobiście nie przypominam sobie żebym implementował gdzieś cokolwiek związanego z GLSL (lub tego używam ale o tym nie wiem :/).

Natomiast pkt. 2 rozumiem jest dla tych co tego GLSL’a nie mają… No więc używam blending, lecz nie bardzo wiem jak mogłoby mi to pomóc.

Znaczy się używasz OGLa w wersji 1.2, albo pobliskiej z fixed-pipeline.

Najpierw narysuj całą siatkę z kolorem, a potem jeszcze raz tą samą siatkę, tylko z teksturą świateł. Test głębi musi być na LEQUAL, nie LESSER, inaczej nie narysuje ci drugiej siatki w tym samym miejscu (o tej samej głębi).