Я пытаюсь нарисовать частично прозрачную текстуру над цветным квадратом, так что цвет светит сквозь прозрачную часть, создавая контур. Это код:Прозрачные текстуры в OpenGL не заменяют quad alpha
// Setup
glEnable(GL_DEPTH_TEST);
glEnable(GL_TEXTURE_2D);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
// (...)
// Get image bits in object 't'
glBindTexture(GL_TEXTURE_2D, textureIDs[idx]);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
glTexImage2D(GL_TEXTURE_2D, 0, 3, t.width(), t.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, t.bits());
// (...)
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
// Underlying coloured quad
glColor4d(0.0, 1.0, 0.0, 1.0);
glBindTexture(GL_TEXTURE_2D, 0);
glBegin(GL_QUADS);
glVertex3d(coords11.first, coords11.second, -0.001);
glVertex3d(coords12.first, coords12.second, -0.001);
glVertex3d(coords21.first, coords21.second, -0.001);
glVertex3d(coords22.first, coords22.second, -0.001);
glEnd();
// Textured quad
glColor4d(1.0, 1.0, 1.0, 0.5);
glBindTexture(GL_TEXTURE_2D, textureIDs[castleTextureIndices[0]]);
glBegin(GL_QUADS);
glTexCoord2d(0.0, 0.0); glVertex3d(coords11.first, coords11.second, 0);
glTexCoord2d(1.0, 0.0); glVertex3d(coords12.first, coords12.second, 0);
glTexCoord2d(1.0, 1.0); glVertex3d(coords21.first, coords21.second, 0);
glTexCoord2d(0.0, 1.0); glVertex3d(coords22.first, coords22.second, 0);
glEnd();
Текстура черная, за исключением случаев, когда она имеет контур замка; эта часть прозрачная (и белая). Поэтому ожидаемое поведение представляет собой черный прямоугольник с зеленым контуром. Что я получаю вместо зеленоватый прямоугольник с белым контуром:
Это с альфа на текстурированной четырехугольника равным 0,5. Если вместо этого я устанавливаю его в 1.0, я возвращаю текстуру без прозрачности, как в (ну, не могу опубликовать второй скриншот как ссылку, он находится на s330.photobucket.com/albums/l412/TWBWar/?action = вид & current = replace10.png). С альфой 0 я получаю зеленый прямоугольник. Поэтому мне кажется, что текстурированный квад смешивается с использованием альфа-значения, установленного glColor4d, вместо значения из текстуры, чего я ожидал от GL_REPLACE. (Я также экспериментировал с GL_DECAL и GL_MODULATE, но я не смог получить такое поведение, которое я хотел.) Может ли кто-нибудь сказать мне, как заставить OpenGL использовать текстуру, а не квад, альфу для смешивания?
Спасибо, в этом была проблема. –