2011-12-19 19 views
5

Mam tekstury z alfa. Chcę go zabarwić jakimś kolorem, więc będzie on kolorowy w zależności od koloru alfa, ale nadmiarowość będzie definiowana tylko przez teksturę alfa.OpenGL ES: Odcień tekstury w kolorze

Jest to podobne do teksturowania wielowarstwowego, ale z kolorem zamiast z drugą teksturą. Jak to zrobić?

(Zaktualizowane) Próbowałem skonfigurować łącznik tekstury. Kolor jest podbarwiony, ale występuje problem z alfa - nie ma wartości z tekstury (jak maska). Mój kod w tej chwili:

glActiveTexture (GL_TEXTURE0); // do we need stage #1? 
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE); 
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_INTERPOLATE); 
glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, (GLfloat*) &tintColor_); 
glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_RGB, GL_TEXTURE); 
glTexEnvi(GL_TEXTURE_ENV, GL_SRC1_RGB, GL_CONSTANT); 
glTexEnvi(GL_TEXTURE_ENV, GL_SRC2_RGB, GL_CONSTANT); 
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR); 
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB, GL_SRC_COLOR); 
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND2_RGB, GL_ONE_MINUS_SRC_ALPHA); 
// this doesn't work for alpha: 
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_REPLACE); 
glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_ALPHA, GL_TEXTURE); 
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA); 

Zrzuty ekranu:

Nie barwienia:

enter image description here

Tint z RGBA = (0, 0,5, 1, 0,5):

enter image description here

+0

Kod wydaje mi się poprawne. Czy możesz dołączyć zrzut ekranu z problemem alfa lub opisać, co w nim złego. – iHunter

+0

Czy możesz przesłać samą teksturę? –

+0

Również renderowanie kodu? –

Odpowiedz

0

Czy próbowałeś powyższy kod z glEnable (GL_BLEND)?

+0

Jest zawsze włączony. – brigadir

0

Być może zechcesz przeczytać OpenGL documentation o przezroczystości, 15.020: "Jak uzyskać przezroczysty efekt?"

Upewnij się, że renderujesz scenę we właściwej kolejności (twoja odpowiedź nie pokazuje żadnego renderingu).

Upewnij się, że używasz pożądanej funkcji mieszania.

Inną propozycją, którą mogę zrobić, jest rozpoczęcie korzystania z shaders. Zawsze czuję się nieco bardziej kontrolowany, kiedy ich używam.

0

Otrzymuję te same wyniki (działa na Androidzie Samsung Galaxy S, co jest warte). Nie rozumiem, dlaczego to nie działa. Dokumenty wydają się dość jasne.

Dla mnie działa, jeśli używam GL_MODULATE dla RGB. Ponownie nie powiedzie się, jeśli użyję GL_ADD lub GL_ADD_SIGNED. Nawet używanie GL_MODULATE na alpha daje takie samo błędne zachowanie podczas używania tych trybów na RGB. Możesz utknąć w modulowaniu kolorów zamiast je interpolować.

Podsumowując, to działa na mnie:

glActiveTexture (GL_TEXTURE0); // do we need stage #1? 
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE); 
glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, (GLfloat*) &tintColor_); 

glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_MODULATE); 
glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_RGB, GL_TEXTURE); 
glTexEnvi(GL_TEXTURE_ENV, GL_SRC1_RGB, GL_CONSTANT); 
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR); 
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB, GL_SRC_COLOR); 

glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_REPLACE); 
glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_ALPHA, GL_TEXTURE); 
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA); 
+0

Tak, w trybie modulacji wszystko działa poprawnie, ale nie wygląda tak, jak chcę. Położę tu +50, aby go nie zgubić. – brigadir

+0

Dzięki za nagrodę. Przepraszam, że nie mogę pomóc. –