Ĺadny brzuch
Witam mam następujacy problem: mam teksturę rośliny (roślina na czarnym tle) i tę teksturę za pomocą funkcji AUX_RGBImageRec *LoadBMP(const char *Filename) wrzucam do swojego projektu. Rysowany jest czworokąt na który daję tę teksturę. Teraz chodzi o to, że chcę aby to co czarne na tej teksturze było niewidocze, tak żeby widoczna była tylko roślina.
Robię coś takiego:
// przezroczysta część tekstury nie będzie rysowana glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_ALPHA_TEST); glAlphaFunc(GL_GREATER, 0); // pobiera macierz modelowania float mat[16]; glGetFloatv(GL_MODELVIEW_MATRIX, mat); // tworzy wektory ortogonalne vector3_t right(mat[0], mat[4], mat[8]); vector3_t up(mat[1], mat[5], mat[9]); // wybiera teksturę kaktusa glBindTexture(GL_TEXTURE_2D, texture[4]); glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); // rysuje wszystkie kaktusy glBegin(GL_QUADS); for (int n = 0; n < 50; n++) { // losowa wielkość kaktusa float size = 5.0f; // losowe położenie na mapie vector3_t pos(-RAND_COORD(999), 0.0, -RAND_COORD(999)); // dolny, lewy wierzchołek glTexCoord2f(0.0, 0.0); glVertex3fv((pos + (right + up) * -size).v); // dolny, prawy wierzchołek glTexCoord2f(1.0, 0.0); glVertex3fv((pos + (right - up) * size).v); // górny, prawy wierzchołek glTexCoord2f(1.0, 1.0); glVertex3fv((pos + (right + up) * size).v); // górny, lewy wierzchołek glTexCoord2f(0.0, 1.0); glVertex3fv((pos + (up - right) * size).v); } glEnd(); glDisable(GL_ALPHA); glDisable(GL_BLEND);
Tylko ze z funkcją AUX_RGBImageRec *LoadBMP(const char *Filename) to nie działa (a musze tej funkcji użyć :/ ). Chodzi o to, że struktura tej funkcji co mam jest przystosowana dla GL_RGB, a powinno byc dla GL_RGBA zeby obsługiwało alfa (jełśi dobrze rozumiem). Tylko nie mam pojecia w jaki sposób przerobić AUX_RGBImageRec *LoadBMP(const char *Filename), żeby kanał alfa działał :/
zanotowane.pl doc.pisz.pl pdf.pisz.pl zsf.htw.pl
Robię coś takiego:
// przezroczysta część tekstury nie będzie rysowana glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_ALPHA_TEST); glAlphaFunc(GL_GREATER, 0); // pobiera macierz modelowania float mat[16]; glGetFloatv(GL_MODELVIEW_MATRIX, mat); // tworzy wektory ortogonalne vector3_t right(mat[0], mat[4], mat[8]); vector3_t up(mat[1], mat[5], mat[9]); // wybiera teksturę kaktusa glBindTexture(GL_TEXTURE_2D, texture[4]); glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); // rysuje wszystkie kaktusy glBegin(GL_QUADS); for (int n = 0; n < 50; n++) { // losowa wielkość kaktusa float size = 5.0f; // losowe położenie na mapie vector3_t pos(-RAND_COORD(999), 0.0, -RAND_COORD(999)); // dolny, lewy wierzchołek glTexCoord2f(0.0, 0.0); glVertex3fv((pos + (right + up) * -size).v); // dolny, prawy wierzchołek glTexCoord2f(1.0, 0.0); glVertex3fv((pos + (right - up) * size).v); // górny, prawy wierzchołek glTexCoord2f(1.0, 1.0); glVertex3fv((pos + (right + up) * size).v); // górny, lewy wierzchołek glTexCoord2f(0.0, 1.0); glVertex3fv((pos + (up - right) * size).v); } glEnd(); glDisable(GL_ALPHA); glDisable(GL_BLEND);
Tylko ze z funkcją AUX_RGBImageRec *LoadBMP(const char *Filename) to nie działa (a musze tej funkcji użyć :/ ). Chodzi o to, że struktura tej funkcji co mam jest przystosowana dla GL_RGB, a powinno byc dla GL_RGBA zeby obsługiwało alfa (jełśi dobrze rozumiem). Tylko nie mam pojecia w jaki sposób przerobić AUX_RGBImageRec *LoadBMP(const char *Filename), żeby kanał alfa działał :/