Я пытаюсь загрузить текстуру со значениями RGBA, но альфа-значения просто делают текстуру более белой, а не регулируют прозрачность. Я слышал об этой проблеме с 3D-сценами, но я просто использую OpenGL для 2D. Можно ли как-нибудь это исправить?
Я инициализирую OpenGL с
glViewport(0, 0, winWidth, winHeight);
glDisable(GL_TEXTURE_2D);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glDisable(GL_DEPTH_TEST);
glClearColor(0, 0, 0, 0);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0, winWidth, 0, winHeight); // set origin to bottom left corner
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glColor3f(1, 1, 1);
Скриншот:
Это размытое пятнистое изображение должно быть полупрозрачным. Черные биты должны быть полностью прозрачными. Как видите, позади него изображение, которое не просвечивает.
Код для генерации этой текстуры довольно длинный, поэтому я опишу, что я сделал. Это массив 40 * 30 * 4 типа unsigned char. Каждому 4-му символу присвоено значение 128 (должно быть прозрачным на 50%, верно?).
Затем я передаю его в эту функцию, загружаю данные в текстуру:
void Texture::Load(unsigned char* data, GLenum format) {
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, _texID);
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, _w, _h, format, GL_UNSIGNED_BYTE, data);
glDisable(GL_TEXTURE_2D);
}
И ... я думаю, что только что нашел проблему. Инициализировал полноразмерную текстуру с этим кодом:
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, _texID);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, tw, th, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, NULL);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
glDisable(GL_TEXTURE_2D);
Но я думаю, что glTexImage2D тоже должен быть GL_RGBA? Я не могу использовать два разных внутренних формата? Или, по крайней мере, не разных размеров (3 байта против 4 байтов)? GL_BGR отлично работает, даже если его инициализировать так ...